Как определить тип свойства у значения `unknown`?
У меня есть следующая функция, которая может принимать значение неизвестного типа:
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
, функция должна возвращать это значение, иначе — пустую строку.
Первый вопрос: что вы рекомендуете использовать для параметра detail
— any
или unknown
?
Второй вопрос: несмотря на все мои попытки, тип для переменной output
оказывается any
. Как я могу убедиться, что он имеет тип string
?
1 ответ(ов)
Это действительно должно быть встроено в 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')
}
}
Этот подход позволяет безопасно получать строковые значения из объектов, даже если они не соответствуют ожидаемой структуре.
Как конвертировать строку в enum в TypeScript?
'unknown' против 'any': в чем разница?
Как получить имена элементов перечисления (enum)?
@Directive против @Component в Angular
Не удается использовать JSX, если не указан флаг '--jsx'