#typescript #typescript-generics
#typescript #typescript-generics
Вопрос:
function assertNotFalsey<T>(test: T): void | never {
if (!test) {
throw new Error('your thing failed');
}
}
function doesNotWork(possiblyNull: { id: string } | null) {
// do something that makes me sure that possiblyNull.id exists unless there is a downnstream error
assertNotFalsey(possiblyNull)
console.log(possiblyNull.id) // Does not compile as `id` might be null
}
function doesWork(possiblyNull: { id: string } | null) {
// do something that makes me sure that possiblyNull.id exists unless there is a downnstream error
if (!possiblyNull) {
throw new Error('your thing failed');
}
console.log(possiblyNull.id) // type is scoped down to not include null.
}
Я хотел бы на самом деле выдавать ошибку при утверждении, а не только указывать компилятору принять то, что я делаю, используя оператор утверждения null . Если бы я мог заставить общую функцию работать, я мог бы расширить ее, чтобы взять массив тестов и напечатать конкретную ошибку, если какой-либо сбой удалит много шаблонов.
Комментарии:
1. Для этого есть функция, известная как подписи утверждений .
Ответ №1:
решает ли это вашу проблему
console.log(possiblyNull?.id) // Does not compile as `id` might be null
Комментарии:
1. Я надеялся уменьшить тип, чтобы разработчику не приходилось отслеживать, что переопределять. Я также хочу, чтобы ошибка запускалась во время выполнения, если в этом случае значение равно null.
Ответ №2:
Как насчет следующего
type HasId = {id: string}
//typegaurd to check for id
function checkId(obj:any) : obj is HasId{
if(obj amp;amp; typeof obj.id === "string"){return true;}
throw new Error("checkID assertion failed")
}
function NowWorks<T extends HasId | null> (possiblyNull: T) {
if (checkId(possiblyNull)) {
console.log(possiblyNull.id) // Does not compile as `id` might be null
}
}