typescript 吊装

b5buobof  于 2022-12-19  发布在  TypeScript
关注(0)|答案(3)|浏览(107)

我试图理解在 typescript 中提升。提升是否发生在 typescript 中,如果是,有什么不同相比,它是如何发生在Javascript中。
即使我在使用interface的函数之后声明了interface,代码也能很好地编译。假设它是因为作为编译的一部分提升而发生的,或者这里涉及到其他的东西,这是否安全?

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

function getCarDetails(carDetails: CarDetails) {

  console.log(carDetails.name);

  console.log(carDetails.topSpeed);

}

interface CarDetails {

  name: string;

  topSpeed: number;

}
pftdvrlh

pftdvrlh1#

吊装是否在 typescript 中进行
如果您的问题是“TypeScript是否会导致代码的提升行为?”,则答案是“否,不会"。
TypeScript不存在于运行时,只存在于编译时。“提升”是一个与运行JavaScript代码相关的概念。TypeScript对运行JavaScript代码的影响与Notepad++一样大--无论你是否真的在那里编写代码。也就是说,它对提升没有任何影响。它是JavaScript引擎在执行代码时执行的。(可能)在TypeScript编译器完成它之后很久。
然而,如果问题是“用TypeScript编写的代码仍然表现出提升行为吗?",则答案是“是的,但与用TypeScript编写的代码没有任何关系"。无论是否存在TypeScript,它都将表现出相同的行为。
即使我在使用接口的函数之后声明了接口,代码也能很好地传递。假设它是由于提升作为传递的一部分而发生的,或者这里涉及到其他东西,这是安全的吗?
为了澄清术语-“提升”指的是在运行代码之前处理声明。下面的JavaScript代码是由于提升而工作的:

fn();
function fn() {};

此TypeScript代码不使用提升 *:

const x: Foo = {id: 1};

interface Foo {
  id: number;
}

类型系统只在编译时存在。任何TypeScript构造(如接口)都将在编译后移除。由于它们不存在于JavaScript中,因此强制在使用接口之前定义它们是一种任意且无用的限制。
问题中的TypeScript代码编译为以下JavaScript代码:

getCarDetails({ name: 'Xyz', topSpeed: 300 });
function getCarDetails(carDetails) {
    console.log(carDetails.name);
    console.log(carDetails.topSpeed);
}

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

c7rzv4ha

c7rzv4ha2#

吊装是否在 typescript 中进行,如果是,
是的。TS只是JS加上了一些比特。
与Javascript中的情况相比有什么不同吗。
没有。
即使我在使用接口的函数之后声明了接口,代码也能很好地传递。假设它是由于提升作为传递的一部分而发生的,或者这里涉及到其他东西,这是安全的吗?
接口只用于类型检查,这只发生在TypeScript中(即在构建时和在linting工具中)。JavaScript不支持接口,因此它们将在编译过程中被丢弃。

dkqlctbz

dkqlctbz3#

是,TypeScript支架吊装
只是一个小小证明:

interface Circle {
    kind: ShapeKind.Circle;
    radius: number;
}
   
interface Square {
    kind: ShapeKind.Square;
    sideLength: number;
}

enum ShapeKind {
    Circle,
    Square,
}

相关问题