任何 JavaScript 代码都是有效的 TypeScript 代码吗?

IT技术 javascript typescript
2021-02-24 06:45:55

目前我已经开始学习了TypeScript从我研究过的文档中TypeScript,我看到了一些JavaScript可以将代码编译为TypeScript代码的示例

我的问题是:TypeScript 语言的设计方式是否使任何 JavaScript 代码都成为有效的 TypeScript 代码?

即任何.js文件都是有效.ts文件吗?

2个回答

让我们假设有效的代码意味着 :就语言规范而言在语法上正确的

那么答案是肯定的


它写在TypeScript 规范(第二段)中:

TypeScript 是 JavaScript 的语法糖。TypeScript 语法是 ECMAScript 2015 (ES2015) 语法的超集。 每个 JavaScript 程序也是一个 TypeScript 程序。

(强调我的)

现在,您通常不希望“不受控制”地使用基本的 JavaScript。毕竟,这是首先创建 TypeScript 语言的原因之一!

然而,有效的 JavaScript 程序技术上有效的 TypeScript。这在规范中可能是因为需要“向后兼容”,或者更好地表述,需要取代ECMAScript


以另一个答案为例,Typescript 代码

var testVar = 4;
testVar = "asdf";

将被转译为完全相同的 JavaScript 代码(带有所有默认编译器选项)

在 Typescriptlang.org 游乐场上进行演示

即使存在 TypeScript 错误,也不会阻止从那里输出有效的 javascript它“编译出错”。(我希望这被称为警告而不是错误,但无论如何)。


另见:https : //basarat.gitbooks.io/typescript/content/docs/why-typescript.html

你的 JavaScript 是 TypeScript

TypeScript 为您的 JavaScript 代码提供编译时类型安全。考虑到它的名字,这并不奇怪。最棒的是这些类型是完全可选的。您的 JavaScript 代码 .js 文件可以重命名为 .ts 文件,TypeScript 仍会为您返回与原始 JavaScript 文件等效的有效 .js。TypeScript 有意且严格地是 JavaScript 的超集,带有可选的类型检查。

可以停用此行为的最简单选项(即使存在类型错误也输出 js)是 --noEmitOnError

@FINDarkside 请同时检查basarat.gitbooks.io/typescript/content/docs/why-typescript.html您的 JavaScript 是 TypeScript TypeScript 为您的 JavaScript 代码提供编译时类型安全。考虑到它的名字,这并不奇怪。最棒的是这些类型是完全可选的。您的 JavaScript 代码 .js 文件可以重命名为 .ts 文件,TypeScript 仍会为您返回与原始 JavaScript 文件等效的有效 .js。TypeScript 有意且严格地是 JavaScript 的超集,带有可选的类型检查。
2021-04-23 06:45:55
只是为了记录,我在 tsc 3.1.3 上尝试了这个,但对于任何版本都应该是相同的。
2021-05-02 06:45:55
正如你在操场上看到的,它不是有效的打字稿(见下面的红线 testVar
2021-05-06 06:45:55
@FINDarkside 这是 TypeScript 中的错误,但它在技术上仍然是有效的 TypeScript,并且编译器由此输出 javascript,恰好是完全相同的代码我现在又试了一次,代码与我在操场上的链接完全相同。我使用tsc myfile.ts, 没有任何 tsconfig.json。我得到了同样的错误,但我也得到了一个功能性的 js 文件。根据规格它是按照设计工作的。
2021-05-13 06:45:55
@FINDarkside 公平点,确实我在我的问题中添加了一个编辑,提到“ noEmitOnError”更有可能是我的观点的正确选项。我将删除对noImplicitAny.
2021-05-19 06:45:55

没有任何有效的 JavaScript 代码是有效的 TypeScript,请参见下面的示例。

var testVar = 4;
testVar = "asdf";

TypeScript 给出以下错误:无法将字符串转换为数字。要使其在 TypeScript 中工作,请添加“:any”,如下所示。

var testVar: any = 4;
testVar = "asdf"

发生这种情况是因为 TypeScript 注意到 testVar 被声明并且在声明中它被分配了一个数字,因此它决定它应该保持一个数字。

@FINDarkside 你检查编译的 js 文件了吗?刚才试了一下,虽然有错误,但是生成了js文件。
2021-05-01 06:45:55
@Tuupertunut 不,这不是有效的 TypeScript,我怀疑它曾经是。错误是 testVar 有类型Number,所以这与noImplicitAny. 实际上,我在 3.1.6、1.7.5 甚至 npm 上的第一个可用版本 0.8.0 上都尝试过这个,但它们都没有编译上面的代码。
2021-05-05 06:45:55
另一个foo = 123在打字稿中无效的示例,因为foo从未声明过,即没有varPS,此代码在严格模式 javascript 中也会失败。
2021-05-09 06:45:55
仅当 Typescript 编译器选项noImplicitAnytrue. 有了它false,这是默认情况,这是有效的打字稿。
2021-05-09 06:45:55
对我来说,上面的 Javascript 代码适用于 TypeScript 文件......有什么建议吗?
2021-05-11 06:45:55