为什么我们在Typescript中需要任何类型?

时间:2019-12-04 20:12:20

标签: javascript typescript

我开始学习打字稿。 而且我想知道如果每个变量都是某种“ any”,为什么我们需要any类型,如果您不指定类型的话,我就假设。

例如,对于x和y的任何值,这些代码输出始终为“是”:

var x = "d";
var y: any = 5 ;
alert(y);
y = x ;
alert(y);
if (x===y) 
  alert("yes");
else
  alert("no");

2 个答案:

答案 0 :(得分:2)

any类型是转义符-它使您可以有效地关闭 Typescript的类型检查。有时,没有一种好方法告诉Typescript您在做什么,因此您可以使用any来解决此问题。

当您省略类型注释时,类型不一定是any-在许多情况下,Typescript会推断,然后强制执行。 let x = 2;会推断x具有类型number-稍后使用x = "cat";会产生错误。在这种情况下,如果需要,您必须使用any

在其他情况下,您必须显式使用any,而不能仅仅“抛弃它”,例如,使用泛型类型:

type Pair<A, B> = [A, B];

declare function needsSomethingPairedWithString(value: Pair<any, string>): void;

对于此needsSomethingPairedWithString函数,我们不在乎该对的第一个元素是什么-也许我们将测试其类型,也许甚至都不会使用它,无论如何,但是重点是我们不在乎但是我们要指定Pair的第二个元素为string。因此,我们需要写Pair<any, string>来表明这一点。

在许多情况下,出于这些目的,最好使用unknownany-unknown的含义更接近于“不知道和不在乎”比any的多。但是,尤其是在处理约束时,any可能是正确的类型。

最后,请注意--noImplicitAny编译器标志的存在:这将导致推断any 的类型变为错误的情况。这迫使您要么修复问题,以便正确推断出它们,要么注释正确的类型,或者至少明确地注释any类型。 强烈建议,从一开始就使用Typescript的项目-隐式any应该保留给逐渐将Javascript转换为Typescript的项目,因为它可能会导致许多错误。使用--noImplicitAny会迫使您对any有所了解,这意味着对于以后阅读any的开发人员来说,这将是显而易见的。这很重要,因为any意味着事物不是会像您想要的那样安全。

答案 1 :(得分:1)

如果每个变量都是某种“ any”,我假设您没有指定类型

这是正确的,但是如果您在带有标志--noImplicitAny的TypeScript上运行,则TypeScript将不再假定变量在大多数情况下应具有类型any,例如

function foo(x) {
    // x is of type any
}

以上内容在--noImplicitAny模式下将产生错误。因此,如果在这种特定情况下您希望x成为any,则必须明确要求它:

function foo(x: any) {
    // x is of type any
}