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

时间:2017-11-17 12:43:08

标签: typescript compilation

我正在使用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生成任何代码?

2 个答案:

答案 0 :(得分:2)

请记住,TypeScript类型系统仅存在于TypeScript本身的范围内。

最后,它将是纯粹的JavaScript。编译器很聪明,它只会在需要时生成代码。这意味着只包含对TypeScript类型cheking有用的信息的接口,没有真正的JavaScript代码,在编译后不会产生任何JavaScript代码:没有理由生成未使用的代码。

这就是你的代码在这里发生的事情:所有界面都告诉TypeScript变量应该是哪种类型,没有任何实际的JavaScript调用。一旦编译器完成其工作以检查类型,接口就没有理由存在于JavaScript中。

答案 1 :(得分:2)

TypeScript编译器执行名为 type erasure 的任务,该任务从输出中删除所有类型(请参阅下面的注释)。这有两个关键原因:

  1. 类型信息无法在逻辑上用JavaScript表示
  2. 类型信息适用于编译器,不适用于运行时,因此输出中不需要
  3. 有些项目旨在将TypeScript的类型引入运行时以执行运行时类型检查,但老实说,这并没有很大的胃口。鉴于我们在设计/编译时始终从完全动态的类型转变为静态类型检查,对于大多数人来说,飞跃可能足够大。

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

    class Example {
        public name: string;
    }
    
    const example = new Example();
    
    console.log(example.name);
    

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

    下面的注释

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