Typescript泛型是否使用类型擦除来实现泛型?

时间:2014-06-28 18:42:38

标签: generics typescript

意思是你不能使用这样的东西?

class Helpers
{
    static ObjectAs<T>(val: any): T {
        if (!(val instanceof T)) {
            return null;
        }

        return <T>val;
    }
}

获取泛型声明的基础类型的任何解决方法?

更新1:

正如Ryan Cavanaugh所说,在编译时,整个类型系统被删除,更像是Java的泛型实现。我相信.Net实现Generics以保存已编译代码中的类型信息比Java更好。 但是,我不禁要问,为什么不允许在TypeScript中对泛型类型和泛型类型参数进行完全运行时内省?为什么TypeScript的设计者决定在运行时删除所有泛型类型信息?

以下TypeScript代码:

function As<T>(n: any): T {
    if (n instanceof T) {
        return n;
    } else {
        return null;
    }
}

var obj: Object = 1;
var x = As<number>(obj);

可以翻译为此JavaScript代码:

function As(n, T) {
    if (n instanceof T) {
        return n;
    } else {
        return null;
    }
}

var obj = 1;
var x = As(obj, Number);

在运行时保留类型信息并与js代码兼容!

更新2: 我已经在CodePlex上发布了这个问题,希望从TypeScript人员中获得更多 https://typescript.codeplex.com/discussions/550262

1 个答案:

答案 0 :(得分:7)

类型系统被完全删除。您可以在生成的代码中看到任何通用函数。

那就是说,对于课程,还有一些运行时信息。你可以这样写:

class A { }
class B { }
function As<T>(n: any, type: { new(...args: any[]): T }): T {
    if(n instanceof type) {
        return n;
    } else {
        return null;
    }
}

var x = new A();
var y = new B();
console.log(As(x, A));
console.log(As(x, B));