扩展类型 "any" 的泛型类型参数不再属于 "any" 类型
Generic type parameter extending type "any" is not of type "any" anymore
我找不到函数 thisDoesNotWork
为什么会导致错误的答案。相比之下,函数 thisWorks
毫无怨言地转译行 anyArgs.whatever();
,我希望它也能在另一个函数中工作。
function thisWorks(anyArgs: any): any {
console.log(anyArgs);
anyArgs.whatever(); // NO ERROR
return anyArgs;
}
function thisDoesNotWork<T extends any>(anyArgs: T): T {
console.log(anyArgs);
anyArgs.whatever(); // ERROR: Property 'whatever' does not exist on type 'T'.
return anyArgs;
}
由于 T
extends type any
,T
也应该是某种 any
,那么为什么行 anyArgs.whatever();
会导致错误在吗?
<T extends any>(anyArgs:T)
与 (anyArgs:any)
不同。泛型将约束添加到 passed-in 或从 method/function 返回的值的类型。所以通用 <T extends any>(anyArgs:T)
参数告诉编译器是的——任何东西都可以传入,但是因为它不知道 T
的类型是什么,它不会允许访问或操作anyArgs
值。
因此,<T extends any>(anyArgs:T)
实际上与 <T>(anyArgs:T)
相同,而不是与 (anyArgs:any)
相同。
正如@jcalz 所提到的,此行为仅在 3.9 版中添加到 TypeScript 中,之前的版本实际上将 extends any
视为与 any
相同。 Link 对此更改 here。
我找不到函数 thisDoesNotWork
为什么会导致错误的答案。相比之下,函数 thisWorks
毫无怨言地转译行 anyArgs.whatever();
,我希望它也能在另一个函数中工作。
function thisWorks(anyArgs: any): any {
console.log(anyArgs);
anyArgs.whatever(); // NO ERROR
return anyArgs;
}
function thisDoesNotWork<T extends any>(anyArgs: T): T {
console.log(anyArgs);
anyArgs.whatever(); // ERROR: Property 'whatever' does not exist on type 'T'.
return anyArgs;
}
由于 T
extends type any
,T
也应该是某种 any
,那么为什么行 anyArgs.whatever();
会导致错误在吗?
<T extends any>(anyArgs:T)
与 (anyArgs:any)
不同。泛型将约束添加到 passed-in 或从 method/function 返回的值的类型。所以通用 <T extends any>(anyArgs:T)
参数告诉编译器是的——任何东西都可以传入,但是因为它不知道 T
的类型是什么,它不会允许访问或操作anyArgs
值。
因此,<T extends any>(anyArgs:T)
实际上与 <T>(anyArgs:T)
相同,而不是与 (anyArgs:any)
相同。
正如@jcalz 所提到的,此行为仅在 3.9 版中添加到 TypeScript 中,之前的版本实际上将 extends any
视为与 any
相同。 Link 对此更改 here。