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

b5lpy0ml  于 2023-04-07  发布在  TypeScript
关注(0)|答案(1)|浏览(163)

意思是你不能用这种东西?

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

        return <T>val;
    }
}

有什么解决方法可以获取泛型声明的基础类型吗?

更新1:

正如Ryan Cavanaugh所提到的,在编译时,整个类型系统被擦除,更像是Java对Generics的实现,我相信.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那里得到更多

u91tlkcl

u91tlkcl1#

类型系统被完全擦除。你可以在任何泛型函数的生成代码中看到这一点。
也就是说,对于类,仍然有一些运行时信息。你可以这样写:

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

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

相关问题