有人可以解释为什么以下打字稿无法解决打字问题吗?
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正在传递字符串。这应该足以解决翻译错误。有人可以解释转译器设计的决定吗?
谢谢!:)
在中y,a具有任何形式,因此它是有效的number,any是作为非常宽松的对象,但是在这种情况下,您可能要说,我不知道这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
| 归档时间: |
|
| 查看次数: |
58 次 |
| 最近记录: |