为什么在 Typescript 中需要 any 类型?

4

我开始学习Typescript。 我想知道如果每个变量都是“任意”类型,那么为什么我们需要any类型,我认为如果不指定类型。

例如,这些代码的输出将始终为“是”,无论x和y的值为何:

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

3
请查看文档any类型允许您在代码中的某些部分放弃类型检查,这些部分难以使其类型安全。 最好只在必要时才使用它。 我几乎可以确定有一个经典的Stack Overflow问题/答案与此相关;正在搜索... - jcalz
1
尝试将其更改为 x = y; 编译器应该会警告您正在尝试将数字分配给字符串(或将某些内容分配给字符串)。 - Heretic Monkey
如果每个变量都是一种“任意”类型” - 你已经回答了自己的问题。如果需要一个变量来保存任何值,那么我们需要的确切类型就是 any - Bergi
1
这些代码的输出总是“是”(yes),无论x和y取什么值 - 除了NaN :-P - Bergi
显示剩余2条评论
2个回答

2
任何类型是一种逃生口,它允许您有效地关闭TypeScript的类型检查。有时,没有好的方法告诉TypeScript你在做什么,所以你使用任何类型来解决这个问题。
并不是当您省略类型注释时,所有类型都是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
如果每个变量都是一种“任何”类型,那么我认为如果您不指定类型,则这是正确的。但是,如果使用标志--noImplicitAny运行TypeScript,则在大多数情况下,TypeScript将不再假定变量应该具有类型any,例如。
function foo(x) {
    // x is of type any
}

以上代码在 --noImplicitAny 模式下会产生错误。因此,如果在这种特定情况下您希望 xany,您必须明确请求它:
function foo(x: any) {
    // x is of type any
}

1
我在评论中提到了类似的内容,不确定这是否是OP所询问的。但是OP似乎误解了推断类型,并且理解--noImplicitAny可能会帮助他们澄清这一点。 - Ruan Mendes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接