«Выбрасывание» в системе типов и проверка типов

#typescript

#typescript

Вопрос:

Иногда я создаю тип, чтобы выполнить какую-то проверку входных данных, которые, как я ожидаю, будут переданы.

 // Library code
type Validate<T> = T extends Something ? T : never

// User code
type MySpecificType = Validate<{/* ... */}> // never if the shape was wrong.

// later on...
const instance : MySpecificType
libraryApi(instance) // error, never. But should happen sooner.
 

Это помогает в выводе типов для более крупных и сложных типов. Если у кого-то есть ошибка в форме типа, то в итоге они получат never . Проблема в том, что ошибка типа while возникает в какой-то момент в потоке, когда они пытаются назначить или использовать ее в функции, а не там, где они создают тип.

Существуют ли какие-либо другие способы короткого замыкания этого процесса только с типами? Иногда я работаю в основном с типами, поэтому нет значений для передачи функции.

Ответ №1:

Вы могли бы просто ограничить T параметр extend нужным типом, это выдаст ошибку при передаче типа в Validate

 interface Something {
    x: string;
}
// Library code
type Validate<T extends Something> = T

// User code
type MySpecificType = Validate<{ x: string, y: number}>
type MySpecificTypeErr = Validate<{ x: number, y: number}> // err