打字稿类型断言和非空检查

时间:2019-09-19 09:48:06

标签: typescript

当我们键入断言时,如果Typescript知道我们做错了,它将抱怨。例如

type Counter = (start: number) => number;
let counterProblemDetected = ((start: number) => "yo") as Counter;

但是启用非null检查后,它不会抱怨不会从函数返回,就像我们设置类型一样:

// 'strictNullChecks' is on
// Typescript does not complain
let counterProblemNotDetected = ((start: number) => {}) as Counter;
// Typescript complains about 'void' not being assignable to type number 
let counterProblemDetected: Counter = ((start: number) => {}) 

我不明白这背后的逻辑。我可以理解,当我们使用类型断言时,Typescript不会进行任何检查,但是由于它会进行一些检查(在第一个示例中它抱怨返回字符串),为什么当返回undefined时却不抱怨预期的数字,并且strictNullChecks设置为true吗?

1 个答案:

答案 0 :(得分:2)

当向下转换(即,将基本类型转换为子类型)时,允许

类型断言。鉴于打字稿系统的结构性质,函数类型(start: number) => number(start: number) => void的子类型,因此这意味着您可以断言(start: number) => void实际上是(start: number) => number

如注释中所述,最好避免类型断言,除非您有充分的理由使用类型断言(例如,编译器无法弄清您知道是正确的东西)。在示例中,您应该将类​​型注释放在变量上,这将使打字稿正确检查类型。