假设我有两个文件,A.js和B.js. 两者都需要像这样相互引用.
A.js
import { B } from "b"
export class A {
constructor(public name: string) {}
}
let b = new B();
b.print(new A("This is a random name"));
Run Code Online (Sandbox Code Playgroud)
B.js
import { A } from "a"
export class B {
print(a: A) {
console.log(a.name);
}
}
Run Code Online (Sandbox Code Playgroud)
上面的示例将创建一个循环引用,该引用当前在我正在使用的JavaScript运行时中不起作用.文件B.js实际上只需要类型信息,而不是实际的导出对象).我希望A.js中的类型得到静态类型检查.这可能吗?
Chr*_*roh 22
现在可以在TypeScript 2.9中直接实现。
type MyType = import('mymodule').MyType;
const myValue: import('mymodule').MyType;
Run Code Online (Sandbox Code Playgroud)
art*_*tem 17
您无需执行任何特殊操作即可从模块中仅导入类型信息a.
Typescript会为你做 - 如果模块b需要表单的唯一东西a是类型信息,编译后的文件b.js将没有require("./a")语句,也就是说,它不会有运行时依赖a.从报价打字稿手册:
编译器检测是否在发出的JavaScript中使用了每个模块.如果模块标识符仅用作类型注释的一部分而从不用作表达式,则不会为该模块发出require调用.
我刚尝试过:
档案a.ts
import { B } from "./b"
export class A {
constructor(public name: string) {}
}
let b = new B();
b.print(new A("This is a random name"));
Run Code Online (Sandbox Code Playgroud)
文件b.ts
import { A } from './a';
export class B {
print(a: A) {
console.log(a.name);
}
}
Run Code Online (Sandbox Code Playgroud)
一起编译它们
tsc a.ts b.ts
Run Code Online (Sandbox Code Playgroud)
这是b.js的结果:
"use strict";
var B = (function () {
function B() {
}
B.prototype.print = function (a) {
console.log(a.name);
};
return B;
}());
exports.B = B;
Run Code Online (Sandbox Code Playgroud)
看到?没有require("./a"),不像a.js包含
var b_1 = require("./b");
Run Code Online (Sandbox Code Playgroud)
最有可能的是,您在问题中发布的示例代码是不完整的,并且真实b模块具有运行时依赖性a- 找出它的位置并摆脱它,并且您不会遇到此问题.
从 TypeScript 3.8 开始,使用import type:
import type { SomeThing } from "./some-module.js";
export type { SomeThing };
Run Code Online (Sandbox Code Playgroud)
参考:
| 归档时间: |
|
| 查看次数: |
6593 次 |
| 最近记录: |