虽然在ES6中有部分Node.js,但是可以在同一个项目中混合一些Typescript模块吗?
例如。在TypeScript中定义了一些通过require
导入到普通ES6文件中的类型?
是的,这是可能的。
合并以下编译器标志
--allowJs
显式支持混合JavaScript和TypeScript源--outDir
由于所有文件都将被转换,因此必须将生成的JavaScript输出到不同的目录中,否则输入的.js
文件将被覆盖1。--checkJs
这是完全可选的。如果指定,编译器将检查JavaScript文件,报告错误,就像在TypeScript文件中一样,否则会容忍不一致。至于在JavaScript文件中使用TypeScript文件中声明的类型,确实可以这样做。
TypeScript实际上为Visual Studio Code等工具中的所有JavaScript智能感知提供支持。
类型可以放在JSDoc2注释中。这些注释可以引用从TypeScript(.ts
/ .tsx
/ .d.ts
)文件导入的类型。像Visual Studio Code这样的IDE将在这些注释中提供语法高亮和自动完成功能。
但是有一个警告。由于JavaScript中的类型没有明确的语法,因此无法单独导入它们,但必须将其附加到导入的值。这通过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:如果另外指定--outDir
标志,则不需要--noEmit
。当使用SystemJS(使用plugin-typescript)或Webpack(使用awesome-typescript-loader或ts-loader)等工具来托管TypeScript转换器时,可以执行此操作。如果您使用TS Node,则同样适用。
2:虽然称为JSDoc注释,但它们是在TypeScript类型系统的上下文中解释的,而不是JSDoc系统。 TypeScript和Google的Closure Compiler等语言和工具有效地劫持了JSDoc语法,因此可以为其构造带来潜在的冲突含义。这通常不是问题,但值得了解,因为很难确定这些注释的适用性和正确性以及它们引用或声明的类型的兼容性。
备注:
虽然这个问题和答案都是关于导入用于JavaScript文件的类型,但由于编译器会根据表达式的值推断出类型,因此通常没有必要。
值得一提的是,如果您发现自己需要编写大量JSDoc样式类型的注释,那么将文件转换为TypeScript几乎肯定会更好,因为在JSDoc中表达类型的语法很笨拙。由于--allowJs
选项,您可以逐个文件地执行此操作,如上所述。