【发布时间】:2017-12-28 09:15:39
【问题描述】:
即使basarat 在他的巨著TypeScript Deep Dive 中对类型断言进行了解释:
基本上,如果
S是T的子类型或T是S的子类型,则从S类型到T的断言成功。
我想知道类型注释 variable: type 和类型断言 expression as type 之间的确切区别是什么,更准确地说是类型断言是否有效,尤其是关于 TypeScript 错误有时令人惊讶:查看它们以获取 foo3和foo5 变量如下:
interface Foo {
n?: number;
s: string;
}
const foo1 = {} as Foo; // ok
const foo2 = { n: 1 } as Foo; // ok
const foo3 = { n: '' } as Foo; // KO: "Property 's' is missing..."
const foo4 = { n: '' as any } as Foo; // ok
const foo5 = { n: 1, x: 2 } as Foo; // KO: "Property 's' is missing..."
const foo6 = { s: '', x: 2 } as Foo; // ok
const foo7 = { s: 1, x: 2 } as Foo; // KO: "Types of property 's' are incompatible."
我注意到的其他区别:在 VSCode 中重命名 Foo 接口中的 n 属性不会传播到被断言的表达式,而它正在使用类型注释变量。
【问题讨论】:
-
这很有趣,因为当您为属性提供错误类型时它会出错,但错误消息总是与其他属性有关。除此之外,如果您提供的属性名称是正确的类型,它允许省略或添加其他属性,这似乎是有道理的。
标签: typescript