generics - Typescript 泛型是否使用类型删除来实现泛型?

标签 generics typescript

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

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

        return <T>val;
    }
}

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

更新 1:

正如 Ryan Cavanaugh 所提到的,在编译时,整个类型系统都被删除了,更像是 Java 对泛型的实现。我相信 .Net 实现的泛型在编译代码中保留类型信息比 Java 更好。 但是,我不禁想知道,为什么不允许在 TypeScript 中对泛型类型和泛型类型参数进行完整的运行时自省(introspection)?为什么 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

最佳答案

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

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

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));

关于generics - Typescript 泛型是否使用类型删除来实现泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24469856/

相关文章:

c# - 泛型还是只使用重载?

ios - 调用函数时显式指定泛型类型约束

ios - NSManagedObjectContext 扩展中的通用函数中的奇怪 Swift 行为

javascript - 使用 requirejs 加载一个文件,里面有几个类(grunt-concat)

postgresql - 使用 NestJS 和 TypeOrm,在我运行 NestJS 应用程序后不会自动创建表

java - 通过泛型方法进行重载

java - 泛型类声明的说明

angular - 运行 jasmine 测试用例后出现错误 :- TypeError: this. snackBarRef.dismiss 不是一个函数

javascript - 递归迭代 Promise

javascript - 通过将数字打包到 Javascript(Typescript)结构的数组中,我可以获得什么好处吗?