我开始学习打字稿。
而且我想知道如果每个变量都是某种“ 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");
答案 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>
来表明这一点。
在许多情况下,出于这些目的,最好使用unknown
到any
-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
}