首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >类型标泛型是否使用类型擦除来实现泛型?

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

Stack Overflow用户
提问于 2014-06-28 18:42:37
回答 1查看 3.4K关注 0票数 14

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

代码语言:javascript
运行
复制
class Helpers
{
    static ObjectAs<T>(val: any): T {
        if (!(val instanceof T)) {
            return null;
        }

        return <T>val;
    }
}

可以找到泛型声明的基本类型吗?

更新1:

正如Ryan所提到的,在编译时,整个类型系统将被删除,更像是Java的泛型实现。我认为在编译代码中保留类型信息的泛型的.Net实现比Java更好。然而,我不禁要问,为什么不可能允许在TypeScript中对泛型类型和泛型类型参数进行全面的运行时内省?为什么TypeScript的设计者决定在运行时删除所有的泛型类型信息?

以下TypeScript代码:

代码语言:javascript
运行
复制
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代码:

代码语言: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 people https://typescript.codeplex.com/discussions/550262那里得到更多信息

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-28 20:51:45

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

尽管如此,对于类,仍然有一些运行时信息。你可以写这个:

代码语言:javascript
运行
复制
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));
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24469856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档