打字稿提升

ati*_*ish 6 javascript typescript

我试图理解打字稿中的提升。提升是否在 Typescript 中进行,如果是,与 Javascript 中的提升方式相比有什么不同吗?

例如:即使我在使用它的函数之后声明了接口,代码也可以很好地转换。可以安全地假设它的发生是由于作为转译的一部分的提升而发生的,或者这里还涉及其他东西。

getCarDetails({name: 'Xyz', topSpeed: 300})

function getCarDetails(carDetails: CarDetails) {

  console.log(carDetails.name);

  console.log(carDetails.topSpeed);

}

interface CarDetails {

  name: string;

  topSpeed: number;

}
Run Code Online (Sandbox Code Playgroud)

VLA*_*LAZ 11

提升是否在 Typescript 中进行

如果您的问题是“ TypeScript 是否会导致代码的提升行为? ”,那么答案是“不,不会”。

TypeScript 在运行时不存在,仅在编译时存在。而“提升”是一个与运行JavaScript 代码相关的概念。TypeScript 对此的影响与 Notepad++ 一样大 - 无论您是否真的在那里编写代码。也就是说对吊装没有影响。JavaScript 引擎在执行代码时会执行此操作。(可能)距离 TypeScript 编译器完成它还很远。

然而,如果问题是“用 TypeScript 编写的代码是否仍然表现出提升行为? ”,答案是“是的,确实如此,但与它是用 TypeScript 编写的事实没有任何关系”。无论 TypeScript 是否存在,它都会表现出相同的行为。

即使我在使用它的函数之后声明了接口,代码也可以很好地转换。可以安全地假设它的发生是由于作为转译的一部分的提升而发生的,或者这里还涉及其他东西。

为了清楚地使用术语 - “提升”是指在运行代码之前处理的声明。此 JavaScript 代码由于提升而起作用:

fn();
function fn() {};
Run Code Online (Sandbox Code Playgroud)

此 TypeScript 代码不使用提升*:

const x: Foo = {id: 1};

interface Foo {
  id: number;
}
Run Code Online (Sandbox Code Playgroud)

类型系统仅在编译时存在。编译后,任何 TypeScript 结构(如接口)都将被删除。由于它们不存在于 JavaScript 中,因此在使用它们之前强制定义接口是一种任意且无用的限制。

问题中的 TypeScript 代码编译为以下 JavaScript 代码:

getCarDetails({ name: 'Xyz', topSpeed: 300 });
function getCarDetails(carDetails) {
    console.log(carDetails.name);
    console.log(carDetails.topSpeed);
}
Run Code Online (Sandbox Code Playgroud)

因此只有getCarDetails()在代码运行时才会被提升。


*const声明在 JavaScript 中提升。这是导致暂时死区的行为。这只是为了完整性 - 它与给定的示例无关。