扩展类型 "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 anyT 也应该是某种 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