是的,这是可能的。
结合以下 TypeScript 编译器选项
-
--allowJs
明确支持混合 JavaScript 和 TypeScript 源
-
--outDir
由于所有文件都将被转译,因此有必要将生成的 JavaScript 输出到不同的目录,否则输入
.js 文件将被覆盖1。
--checkJs
这完全是可选的。如果指定,编译器将对 JavaScript 文件进行类型检查,报告错误,就像在 TypeScript 文件中一样,否则它会容忍不一致。
至于在JavaScript文件中使用TypeScript文件中声明的类型,确实可以做到。
TypeScript 实际上为 Visual Studio Code 等工具中的所有 JavaScript 智能感知提供支持。
类型可以放在 JSDoc2 cmets 中。这些 cmets 可以引用从 TypeScript (.ts/.tsx/.d.ts) 文件导入的类型。像 Visual Studio Code 这样的 IDE 将在这些 cmets 中提供语法高亮和自动补全。
但是有一个警告。因为 JavaScript 中的类型没有清单语法,所以它们不能单独导入,而必须附加到导入的 value 上。这可以通过 TypeScript 的声明合并最方便地实现,如下所示。
例子:
a.ts
export default createThing;
function createThing(...args): createThing.Thing {...}
namespace createThing {
export interface Thing {...}
}
b.js
import createThing from './a';
/**
* @param {createThing.Thing} thing
*/
export function takesThing(thing) {}
注意事项:
1:如果您另外指定--noEmit 标志,则不需要--outDir。当使用诸如SystemJS(带有plugin-typescript)或Webpack(带有ts-loader)之类的工具来托管TypeScript 转译器时,您会这样做。如果您使用的是TS Node,这同样适用。
2:虽然称为JSDoc cmets,但它们是在 TypeScript 类型系统的上下文中解释的,不是 JSDoc 系统。 TypeScript 和 Google 的 Closure Compiler 等语言和工具有效地劫持了 JSDoc 语法以实现其自身目的,从而赋予其构造潜在的冲突含义。这通常不是问题,但值得了解,因为很难确定这些 cmets 的适用性和正确性以及它们引用或声明的类型的兼容性。
备注:
虽然这个问题和答案都是关于导入类型以供在 JavaScript 文件中使用,但通常没有必要,因为编译器会根据表达式的值推断类型。
还值得一提的是,如果您发现自己需要编写大量 JSDoc 样式的类型注释,则几乎可以肯定将文件转换为 TypeScript 会更好,因为在 JSDoc 中表达类型的语法很笨拙。感谢--allowJs 选项,您可以逐个文件地执行此操作,如上所述。