【发布时间】:2014-08-19 15:04:33
【问题描述】:
意思是你不能用这样的东西?
class Helpers
{
static ObjectAs<T>(val: any): T {
if (!(val instanceof T)) {
return null;
}
return <T>val;
}
}
获取泛型声明的基础类型的任何解决方法?
更新 1:
正如 Ryan Cavanaugh 所提到的,在编译时,整个类型系统都会被擦除,更像是 Java 的泛型实现。我相信在编译代码中保留类型信息的泛型的 .Net 实现比 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
【问题讨论】:
-
多么棒的问题...希望它不会关闭 SO 风格
-
规范的第 2 页指出,在编译器发出 JavaScript 之前,所有类型信息都会被擦除。鉴于这些信息,我最好的猜测是您的 instanceof 运算符在运行时环境中将毫无意义。我最好的建议是在他们的论坛中创建一个讨论规范的帖子:typescript.codeplex.com/discussions/topics/5488/…。如果还没有,你可能会让他们考虑支持这个。
-
@ErikNedwidek 已经在上面了 :)
-
你不能按照你的建议去做,因为你可以在运行时动态调用函数,所以转译器不一定知道将对
As(n)的调用转换为As(n, T)。更不用说它会用大量现有的 TypeScript 代码进行重大更改。另外,当 T 是数字、字符串或布尔值时会发生什么?你不能在上面调用instanceof,也不能作为参数传入。您必须实现一些 TS 要求,即如果在函数内部调用instanceof,您的泛型必须是类且不能是原语。
标签: generics typescript