为什么在打字稿中使用“ any”会丢失强类型?

Aks*_*gue 3 typescript

有人可以解释为什么以下打字稿无法解决打字问题吗?

function z(a: number) {
    console.log(a*a);
}

z(1); // works
z("xyz"); // fails type checking

function y(a: any){
    z(a); // I expect this statement to be erroneous
}

y(1); // works
y("xyz"); // does not fail type checking; feels like duck-typing?
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,编译器知道y正在传递a string,因此z正在传递字符串。这应该足以解决翻译错误。有人可以解释转译器设计的决定吗?

谢谢!:)

Cod*_*gar 7

在中ya具有任何形式,因此它是有效的numberany是作为非常宽松的对象,但是在这种情况下,您可能要说,我不知道这a是什么,因此我可能想在调用之前执行一些检查,z然后应使用unknown作为最少允许的类型。

function y(a: unknown){
  z(a); // Argument of type 'unknown' is not assignable to parameter of type 'number'.ts(2345)
  if (typeof a === 'number') {
    z(a) // all good
  }
}
Run Code Online (Sandbox Code Playgroud)

any是为了与现有的javascript代码兼容或为了逃避安全性而存在的,从typescript 3.0 unknown开始,如果不确定我们要处理的是哪种类型,请首先键入该类型,然后再强制缩小该类型。https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-0.html#new-unknown-top-type