在下面的最后一行中,我想实例化一个多态函数并将其作为参数传递。
function id<T> (x:T) { return x; }
console.log ( id<number>(0) )
console.log ( id< (x:number)=>number > (id) (0) )
console.log ( id< (x:number)=>number > (id<number> ) (0) )
我正在error TS1005: '(' expected.
所以我似乎只有在调用函数时才能实例化类型参数。真的?
离开实例化(倒数第二行)就行了。
作为参考,这适用于C#(注意:id<int>
):
using System;
class P {
static T id<T> (T x) { return x; }
public static void Main (string [] argv) {
Console.WriteLine (id<Func<int,int>> (id<int>) (0));
}
}
嗯,我想这在TypeScript中是不可能的。标准 https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#4-expressions说&#34; TypeScript使用以下结构扩充JavaScript表达式:...在函数调用中键入参数...&#34;这显然意味着&#34;仅在函数调用&#34;中键入参数。
答案 0 :(得分:7)
清理代码示例以明确目的。您需要以下内容:
function id<T>(x: T) { return x; }
(id<(x: number) => number>(id<number>))(0);
基本上希望将id<number>
作为变量。即:
function id<T>(x: T) { return x; }
let idNum = id<number>; // This is what you want
语法不正确。您无法以这种方式创建具体类型。可悲的是,你需要使用一种类型断言,将可靠性的负担放在肩上
let idNum = id as {(x:number):number};
答案 1 :(得分:1)
以下是一个解决方案:use interfaces。
function id<T>(x: T) {return x}
interface id<T> { (x:T): T; }
const idNum: id<number> = id;
idNum(1); // ok
idNum('1'); // gives an error
另一种方式:use a wrapper function。
function id<T>(x: T) {return x}
function idNum(x:number) { return id(x); }
idNum(1); // ok
idNum('1'); // error
您可以在两个示例中将number
替换为您想要的任何类型。您可以在任意位置使用idNum
代替id<number>
。
答案 2 :(得分:0)
类型信息仅在编译类型中用于验证类型检查。之后它就会丢失。例如,您的打字稿(没有最后一行)将被编译为以下javascript:
function id(x) { return x; }
console.log(id(0));
console.log(id(id)(0));
如您所见,不再存在通用类型信息。因此,除了&#34; id&#34;之外,你不能引用任何其他内容。功能对象。