为什么 TypeScript 不生成接口代码?

Ala*_*ALI 3 compilation typescript

我正在使用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;}
Run Code Online (Sandbox Code Playgroud)

将被翻译为:

var p;
p.id = 123;
p.fullName = 'John Doe';
p.sayHello = function () { return "Hello from " + p.fullName; };
Run Code Online (Sandbox Code Playgroud)

有没有解释为什么 TypeScript 不生成任何代码interface

Fen*_*ton 9

TypeScript 编译器执行一项称为类型擦除的任务,该任务从输出中删除所有类型(请参阅下面的注释)。造成这种情况的主要原因有两个:

  1. 类型信息无法在 JavaScript 中逻辑地表示
  2. 类型信息适用于编译器,而不是运行时,因此输出中不需要它

有一些项目打算将 TypeScript 的类型引入运行时,以执行运行时类型检查,但老实说,人们对此并没有太大兴趣。鉴于我们始终从完全动态类型转向设计/编译时静态类型检查,对于大多数人来说,这一飞跃可能已经足够大了。

类型并不是编译过程中唯一可以删除的东西;另一个示例是未初始化的类成员,例如name下面示例中的属性,您在 JavaScript 文件中找不到它。

class Example {
    public name: string;
}

const example = new Example();

console.log(example.name);
Run Code Online (Sandbox Code Playgroud)

但应用程序中的大部分删除都是类型和环境声明。

下面的注释

所有类型都被删除?对于发出与反射一起使用的类型信息有一些实验性支持,您可以使用Reflect-metadata包进行尝试。