【问题标题】:Typescript type assertions and non null checks打字稿类型断言和非空检查
【发布时间】:2019-09-19 09:48:06
【问题描述】:

当我们进行类型断言时,如果 Typescript 知道我们不可能正确,它就会抱怨。比如

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

但是当启用非空检查时,它不会抱怨没有从函数返回,就像我们设置了类型一样:

// '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

【问题讨论】:

  • "如果 Typescript 知道我们不可能是对的" --- 使用 as 的情况确实很少。另一方面,在使用 TS 开发几年后,我什至记不起一个需要它的案例。像您的问题一样简单的东西当然不需要它。
  • @zerkms 我是 TypeScript 的新手,这个问题的灵感来自文档 (typescriptlang.org/docs/handbook/interfaces.html#hybrid-types) 中看到的示例,他们使用类型断言来定义函数(混合类型)的属性。
  • 对。我建议你不要太关注它,我个人认为as 很危险:如果你是初学者,你比编译器更了解的机会几乎为零;如果您非常先进,以至于您比编译器真正了解 - 你不需要任何人的帮助:-)

标签: typescript


【解决方案1】:

向下转换时允许类型断言(即,您将基类型转换为子类型)。鉴于打字稿系统的结构性质,函数类型(start: number) => number(start: number) => void 的子类型,因此这意味着您可以断言(start: number) => void 实际上是(start: number) => number

如 cmets 中所述,最好避免使用类型断言,除非您有充分的理由使用类型断言(例如,编译器无法找出您知道为真的某事)。在您的示例中,您应该只将类型注释放在变量上,这将使打字稿正确检查类型。

【讨论】:

    猜你喜欢
    • 2018-11-03
    • 2017-11-08
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多