我正在使用TS Playground来学习TypeScript。我发现奇怪的是TypeScript不会为接口生成特定的代码。
示例:
interface Person {
id: number,
fullName: string,
sayHello: Function
}
let p: Person;
p.id = 123;
p.fullName = 'John Doe';
p.sayHello = function () {return "Hello from " + p.fullName;}
将被翻译为:
var p;
p.id = 123;
p.fullName = 'John Doe';
p.sayHello = function () { return "Hello from " + p.fullName; };
是否有解释为什么TypeScript不会为interface
生成任何代码?
答案 0 :(得分:2)
请记住,TypeScript类型系统仅存在于TypeScript本身的范围内。
最后,它将是纯粹的JavaScript。编译器很聪明,它只会在需要时生成代码。这意味着只包含对TypeScript类型cheking有用的信息的接口,没有真正的JavaScript代码,在编译后不会产生任何JavaScript代码:没有理由生成未使用的代码。
这就是你的代码在这里发生的事情:所有界面都告诉TypeScript变量应该是哪种类型,没有任何实际的JavaScript调用。一旦编译器完成其工作以检查类型,接口就没有理由存在于JavaScript中。
答案 1 :(得分:2)
TypeScript编译器执行名为 type erasure 的任务,该任务从输出中删除所有类型(请参阅下面的注释)。这有两个关键原因:
有些项目旨在将TypeScript的类型引入运行时以执行运行时类型检查,但老实说,这并没有很大的胃口。鉴于我们在设计/编译时始终从完全动态的类型转变为静态类型检查,对于大多数人来说,飞跃可能足够大。
类型不是编译期间唯一可以删除的东西;另一个例子是未初始化的类成员,例如下面示例中的name
属性,您在JavaScript文件中找不到它。
class Example {
public name: string;
}
const example = new Example();
console.log(example.name);
但是,应用程序中的大多数删除都是类型和环境声明。
所有类型都被删除了吗?对于要与反射一起使用的发射类型信息有一些实验支持,您可以尝试使用reflect-metadata包。