实例化多态函数作为TypeScript中的参数

实例化多态函数作为TypeScript中的参数,typescript,Typescript,在下面的最后一行中,我想实例化一个多态函数并将其作为参数传递 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) ) 嗯,我想这在打字

在下面的最后一行中,我想实例化一个多态函数并将其作为参数传递

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) )
嗯,我想这在打字脚本中是不可能的。标准
表示“TypeScript使用以下结构来增强JavaScript表达式:…函数调用中的类型参数…”,这显然意味着“仅在函数调用中的类型参数”

类型信息仅用于编译类型以验证类型检查。在那之后它就丢失了。例如,您的typescript(没有最后一行)将编译为以下javascript:

function id(x) { return x; }
console.log(id(0));
console.log(id(id)(0));

正如您所看到的,不再存在泛型类型信息。因此,您不能引用除“id”函数对象之外的任何其他对象。

清理代码示例以明确用途。您需要以下内容:

function id<T>(x: T) { return x; }
(id<(x: number) => number>(id<number>))(0);
这里有一个解决方案:

函数id(x:T){return x}
接口id{(x:T):T;}
const-idNum:id=id;
idNum(1);//好啊
idNum('1');//给出一个错误
另一种方式:

函数id(x:T){return x}
函数idNum(x:number){返回id(x);}
idNum(1);//好啊
idNum('1');//错误

在这两个示例中,您可以用您想要的任何类型替换
number
。使用
idNum
而不是
id
无论您想在哪里使用

谢谢,但这并不能回答问题。
function id<T>(x: T) { return x; }
(id<(x: number) => number>(id<number>))(0);
function id<T>(x: T) { return x; }
let idNum = id<number>; // This is what you want
let idNum = id as {(x:number):number};
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
function id<T>(x: T) {return x}
function idNum(x:number) { return id(x); }

idNum(1); // ok
idNum('1'); // error