仅从模块导入类型信息

jns*_*alm 8 typescript

假设我有两个文件,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- 找出它的位置并摆脱它,并且您不会遇到此问题.


Noa*_*ahl 5

从 TypeScript 3.8 开始,使用import type

import type { SomeThing } from "./some-module.js";

export type { SomeThing };
Run Code Online (Sandbox Code Playgroud)

参考:

https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html#type-only-imports-exports