typescript - 为什么 TypeScript 不为接口(interface)生成代码?

我正在使用 TS Playground学习 typescript 。我发现奇怪的是 TypeScript 不会为接口(interface)生成特定代码。

例子:

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 生成任何代码?

最佳答案

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

  1. 类型信息不能在逻辑上用 JavaScript 表示
  2. 类型信息是为编译器准备的,而不是为运行时准备的,所以输出中不需要它

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

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

class Example {
    public name: string;
}

const example = new Example();

console.log(example.name);

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

下面的注释

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

https://stackoverflow.com/questions/47350929/

相关文章:

laravel - 批量更新 Laravel 中具有多关系的表

r - 如何从日期获取 ISO 周数

msbuild - 使用 MSBuild 通过 VS2017 构建 SSDT 项目失败

batch-file - 在没有出现超时消息的情况下在批处理文件中运行超时命令

reactjs - 文件上传不适用于按钮单击 Material -UI V1 ReactJs

php - Laravel paginate 无法在 querybuilder 上选择某些列

haskell - `pure x = (\_ -> x)` 是什么意思?

r - 计算 R 中分类变量的出现次数

python - 如何计算图像中的亮像素?

python-2.7 - 我怎么知道我使用的是哪个版本的 Tkinter?