网站搜索

TypeScript 内联类型未被检查


在 TypeScript 中声明变量类型至少有两种方法,但它们似乎以不同的方式工作。这是一个漏洞还是一个特性?在我看来像是一个漏洞。

type T1 = Partial<{ a: string }>

const wrong1: T1 = { a1: 'a' } // this fails which is fine
const correct1: T1 = { a: 'a' } // this doesn't fail which is fine

const wrong2 = <T1>{ a1: 'a' } // this doesn't fail which is wrong
const correct2 = <T1>{ a: 'a' } // this doesn't fail which is fine

沙箱链接

TS 似乎甚至能正确解析类型,但出于某种原因并没有检查它。

答案#1

你的 wrong2 示例的问题是它是一个类型断言。运行时不支持。

类型断言 vs. 类型转换

之所以不称之为“类型转换”,是因为转换通常意味着某种运行时支持。然而,类型断言完全是一种编译时的构造,是你向编译器提供关于如何分析代码的提示的一种方式。

断言被认为有害

在许多情况下,断言可以让你轻松迁移旧代码(甚至将其他代码示例复制粘贴到你的代码库中)。然而,你在使用断言时应该小心。以我们最初的代码为例,编译器不会保护你免于忘记真正添加你承诺的属性。

所以在这种情况下,你是在告诉编译器你“更清楚”,并且被赋值给wrong2的值实际上是不同类型的。