为什么TypeScript不强制在回调中使用通用参数?

sbi*_*nko 3 generics typescript

考虑以下使用2.6.1编译的TypeScript代码:

function foo<T> (bar: T, baz: (T) => void) {
    const test: T = bar;
    baz(test);
}

const string: string = "a";
foo(string, num => num.parseInt());
Run Code Online (Sandbox Code Playgroud)

我希望编译会失败,因为使用foo调用了函数string,但是传递的回调函数使用的是-中不可用的方法,string而函数签名指示回调函数中的参数类型应与相同。第一个参数的类型。

但是,代码会编译,然后在运行时失败。

我想念什么?

art*_*tem 6

好吧,因为Tin baz: (T) => void不是类型名称,所以它是参数名称。

当您将语法固定为想要的含义时,您会得到预期的错误:

function foo<T> (bar: T, baz: (t: T) => void) {
    const test: T = bar;
    baz(test);
}

const s: string = "a";
foo(s, num => num.parseInt()); 
// Property 'parseInt' does not exist on type 'string'.
Run Code Online (Sandbox Code Playgroud)

当然,很难发现这样的错误-只有在将您的代码粘贴到Typescript操场并打开时,我才看到它--noImplicitAny(T)立即以突出显示Parameter 'T' implicitly has an 'any' type。甚至那个错误也让我感到困惑-等待什么- T不是参数,而是类型-...!