意思是你不能使用这样的东西?
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/