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

Generics Typescript泛型是否使用类型擦除来实现泛型?,generics,typescript,Generics,Typescript,意思是你不能用这样的东西 class Helpers { static ObjectAs<T>(val: any): T { if (!(val instanceof T)) { return null; } return <T>val; } } 在运行时保留类型信息并与js代码兼容 更新2: 我已经在CodePlex上发布了这个问题,希望从TypeScript的人那里得到更多 字

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

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

        return <T>val;
    }
}
在运行时保留类型信息并与js代码兼容

更新2: 我已经在CodePlex上发布了这个问题,希望从TypeScript的人那里得到更多

字体系统被完全擦除。您可以在为任何泛型函数生成的代码中看到这一点

也就是说,对于类,仍然有一些运行时信息。你可以这样写:

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));
class A{}
B类{}
函数As(n:any,type:{new(…args:any[]):T}):T{
if(n instanceof type){
返回n;
}否则{
返回null;
}
}
var x=新的A();
var y=新的B();
console.log(As(x,A));
控制台日志(As(x,B));

这是一个多么棒的问题。。。希望它不会关闭,所以规范的样式页2声明在编译器发出JavaScript之前,所有类型信息都会被删除。考虑到这些信息,我最好的猜测是instanceof操作符在运行时环境中没有意义。我最好的建议是在他们的论坛上发表一篇帖子,讨论规范:。如果还没有,你可能会让他们考虑支持它。@ErikNedwidek已经在上面了:)你不能按照你的建议去做,因为你可以在运行时动态调用函数,所以传输程序不一定知道如何将对
As(n)
的调用转换为
As(n,t)
。更不用说它会对大量现有的TypeScript代码进行突破性的更改。另外,当T是数字、字符串或布尔值时会发生什么?不能对其调用
instanceof
,也不能将其作为参数传入。您必须实现一些TS要求,即如果在函数中调用
instanceof
,则泛型必须是类,而不能是原语。在运行时使用类型参数保留类型非常有意义,但是我想知道为什么TypeScript设计人员决定在生成的js代码中完全删除泛型类型?请参阅原始文档中的更新post@KamyarNazeri“让类型参数在运行时保留类型非常有意义”。但是Javascript不是鸭子类型的语言吗?因为目标环境没有类型的概念,所以完全删除类型是非常有意义的。@Aron我相信你误解了我的意思。考虑到方法签名被保留,类型参数被保留在已编译的js文件中!然而,当泛型类型声明不存在于方法签名中时,它会被类型擦除删除。此外,JavaScript确实是一种鸭子类型的语言,但是TypeScript是JavaScript的超集,我相信泛型类型擦除可能会有更多的问题更新假定类型系统中的所有类型都由相应的构造函数表示,这绝对不是事实——匿名类型、接口、,etc都没有明显的对应于them@RyanCavanaugh我已经在codeplex上发布了这个问题,你能在那里更具体一些吗:
function As(n, T) {
    if (n instanceof T) {
        return n;
    } else {
        return null;
    }
}

var obj = 1;
var x = As(obj, Number);
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));