我试图理解在 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;
}
3条答案
按热度按时间pftdvrlh1#
吊装是否在 typescript 中进行
如果您的问题是“TypeScript是否会导致代码的提升行为?”,则答案是“否,不会"。
TypeScript不存在于运行时,只存在于编译时。“提升”是一个与运行JavaScript代码相关的概念。TypeScript对运行JavaScript代码的影响与Notepad++一样大--无论你是否真的在那里编写代码。也就是说,它对提升没有任何影响。它是JavaScript引擎在执行代码时执行的。(可能)在TypeScript编译器完成它之后很久。
然而,如果问题是“用TypeScript编写的代码仍然表现出提升行为吗?",则答案是“是的,但与用TypeScript编写的代码没有任何关系"。无论是否存在TypeScript,它都将表现出相同的行为。
即使我在使用接口的函数之后声明了接口,代码也能很好地传递。假设它是由于提升作为传递的一部分而发生的,或者这里涉及到其他东西,这是安全的吗?
为了澄清术语-“提升”指的是在运行代码之前处理声明。下面的JavaScript代码是由于提升而工作的:
此TypeScript代码不使用提升 *:
类型系统只在编译时存在。任何TypeScript构造(如接口)都将在编译后移除。由于它们不存在于JavaScript中,因此强制在使用接口之前定义它们是一种任意且无用的限制。
问题中的TypeScript代码编译为以下JavaScript代码:
因此,当代码运行时,只有
getCarDetails()
会被提升。const
declarations are hoisted in JavaScript。这是导致the temporal dead zone的行为。这仅仅是为了完整性-它与给定示例无关。c7rzv4ha2#
吊装是否在 typescript 中进行,如果是,
是的。TS只是JS加上了一些比特。
与Javascript中的情况相比有什么不同吗。
没有。
即使我在使用接口的函数之后声明了接口,代码也能很好地传递。假设它是由于提升作为传递的一部分而发生的,或者这里涉及到其他东西,这是安全的吗?
接口只用于类型检查,这只发生在TypeScript中(即在构建时和在linting工具中)。JavaScript不支持接口,因此它们将在编译过程中被丢弃。
dkqlctbz3#
是,TypeScript支架吊装
只是一个小小证明: