类型系统中的“投掷”和验证类型

时间:2019-04-18 16:44:15

标签: 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.

这有助于较大,更复杂的类型的类型推断。如果某人在字体形状上有错误,那么他们将以永不结束。问题在于,当类型错误尝试在函数中分配或使用它而不是在创建类型的地方进行时,有时会在下游发生。

还有其他方法可以使该过程与类型短路吗?有时我主要是在使用类型,所以没有值可以传递给函数。

1 个答案:

答案 0 :(得分:2)

您可以将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