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

时间:2016-01-18 16:47:20

标签: 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) )

我正在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;中键入参数。

3 个答案:

答案 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;之外,你不能引用任何其他内容。功能对象。