0

Как определить тип свойства у значения `unknown`?

1

У меня есть следующая функция, которая может принимать значение неизвестного типа:

function formatReason(detail: unknown): string {
    if (detail 
        && detail instanceof Object 
        && detail.constructor.name === 'Object' 
        && detail.hasOwnProperty('description') 
        && typeof detail['description'] === 'number'
    ) {
        const output = detail['description'];
        return output;
    }

    return '';
}

Параметр detail может быть любым значением. Если это объект с свойством description типа string, функция должна возвращать это значение, иначе — пустую строку.

Первый вопрос: что вы рекомендуете использовать для параметра detailany или unknown?

Второй вопрос: несмотря на все мои попытки, тип для переменной output оказывается any. Как я могу убедиться, что он имеет тип string?

1 ответ(ов)

0

Это действительно должно быть встроено в TypeScript!

Тем не менее, вот мой слегка более универсальный вариант, который вернет строковое значение свойства, если оно присутствует.

function getStrProp(o: unknown, prop: string): string | unknown {
    try {
        // eslint-disable-next-line @typescript-eslint/no-explicit-any
        const p = (o as any)[prop]
        if (typeof p === 'string') {
            return p
        }
    } catch {
        // проигнорировать
    }
    return undefined
}

Мой типичный случай использования — для обработки ошибок.

try {
    httpServer = https.createServer(...)...
} catch (err) {
    if (getStrProp(err, 'code') === 'ENOENT') {
        throw 'Отсутствуют HTTPS сертификаты: ' + getStrProp(err, 'message')
    }
}

Этот подход позволяет безопасно получать строковые значения из объектов, даже если они не соответствуют ожидаемой структуре.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь