我认为在TypeScript中使用any 是绝对可以的。
JavaScript的默认#号
好吧,在你开始对着屏幕尖叫并打开你的Twitter客户端对我喊话之前,请听我说完。TypeScript是一个渐进式的类型系统。可以随心所欲地开启类型是其设计的一部分。我也认为这也是TypeScript如此大受欢迎的原因之一。
any 是JavaScript的默认。JavaScript有类型,但没有类型检查。 是TypeScript的说法。为我关闭类型检查。而这在某些情况下是有帮助的。比如说。any
从JavaScript迁移过来。#
当你从JavaScript迁移到TypeScript时,有可能你已经有了一个庞大的代码库,其中有很多关于你的数据结构和对象如何工作的隐含信息。要一次性把所有的东西都说出来可能是件麻烦事。any 可以帮助你逐步迁移到一个更安全的代码库。
使用类型支持不佳的第三方库#
你可能有一个或其他的JavaScript依赖,仍然拒绝使用TypeScript(或类似的东西)。或者更糟糕的是:没有最新的类型来支持它。Definitely Typed是一个伟大的资源,但它也是由志愿者维护的。它是对存在于JavaScript中的东西的形式化,但不是直接从JavaScript中衍生出来的。可能会有错误(即使是像React这样流行的类型定义),或者它们只是可能不是最新的!这时, 可以帮助你。
这就是any ,可以极大地帮助你。当你知道这个库是如何工作的时候,如果文档足够好,可以让你去做,如果你少用它,any ,可以让你松一口气,而不是与类型作斗争。
顺利的犯罪发展#。
在上几篇文章中,我写到了为什么有些东西 在TypeScript中的工作方式与在JavaScript中不同。这与TypeScript团队为确保边缘情况下的类型安全而必须做出的权衡有很大关系。是的,在你目前的情况下,JavaScript会像这样工作。但在有些情况下,你的软件可能会出现可怕的故障。
在这样的情况下,any 可以帮助你暂时关闭类型检查,因为你知道自己在做什么。由于你可以从每个类型到any ,但也可以回到每个其他类型,你在整个代码中拥有小的、明确的不安全块,在那里你负责正在发生的事情。这就是我所说的 "平滑犯罪 "开发。
知道它是做什么的#
:any 是一个通配符!使用any ,你就可以全力以赴,根本不用考虑任何类型检查。那么为什么像any 这样的东西会存在呢?
这是由JavaScript的性质决定的。在JavaScript中,你没有被束缚在一个类型上,任何类型的值都可以出现在你的变量和属性中。有些开发者过分地利用了这一点
any 这反映了JavaScript的总体灵活性;你可以把它看作是一个后门,在这个世界上你既不想要工具,也不想要类型安全。通过各种手段,使用任何,但要了解它是如何工作的,以及用它做什么--使用它的风险由你自己承担!
要确定你想明确地使用any ,作为一个类型注释。而如果你想通过后门进入JavaScript的灵活性,要非常有意地通过类型断言。
// theObject is an object we don’t have a type for,
// but we know exactly what
// we are doing!
(theObject as any).firstLetter.toUppercase()
当然,类型断言也适用于其他类型。如果你想确保你的代码中没有any ,你不希望它出现在某个地方,可以将编译器标志noImplicitAny 设为true。然后,TypeScript将确保你要么赋值以正确推断类型,要么,在any ,确保你明确注释。
// deliveryAddress is of type any, because we
// didn’t annotate a specific type. Implicit anys are
// hard to track down later on, that’s why it’s good
// to have TypeScript scream at us
function printAddress(deliveryAddress) {
console.log(deliveryAddress)
}
如果我们用any 明确注释函数参数和变量,一旦我们决定了真正的类型,它们就会变得更容易被追踪。
考虑到未知的#
any 有一个叫做 的对应类型。它也是一个顶级类型,包含了所有可能的值。不过,用法是不同的。 允许我们做unknown any 任何事情,而 则不允许我们做unknown 任何事情。这可以在很多情况下发挥作用,因为你不知道你在处理哪种类型(例如,传递无法在通用变量中正式化的任意数据)。
function selectDeliveryAddress(addressOrIndex: unknown): string {
if(typeof addressOrIndex === 'number' &&
addressOrIndex < deliveryAddresses.length) {
return deliveryAddresses[addressOrIndex]
}
return addressOrIndex; //💥 Error!
}
轰!"。这正是我们想要的。"number类型不能被分配到string类型"。我们必须进行类型检查并触发控制流分析;否则,TypeScript将抛出一个错误。