Используя строгие нулевые проверки, как я могу в общем утверждать, что not null там, где тип ограничен, а ошибка выдается при сбое?

#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
  }
}
  

Ссылка на игровую площадку