【发布时间】:2020-06-11 22:42:57
【问题描述】:
使用 Typescript,有没有办法只从外部模块导入类型?
基本上,我只希望一个模块知道另一个模块的类型(以支持 Intellisense),但不会在 JavaScript 中发出导入。我想这样做是因为有问题的模块可能已加载也可能未加载 - 即没有硬依赖,但我希望有一些类型的代码可以运行并使用该模块(如果存在)。
希望这很清楚。
【问题讨论】:
-
为什么这被否决了?
使用 Typescript,有没有办法只从外部模块导入类型?
基本上,我只希望一个模块知道另一个模块的类型(以支持 Intellisense),但不会在 JavaScript 中发出导入。我想这样做是因为有问题的模块可能已加载也可能未加载 - 即没有硬依赖,但我希望有一些类型的代码可以运行并使用该模块(如果存在)。
希望这很清楚。
【问题讨论】:
您可以将定义文件与参考注释一起使用,这样就可以在不添加任何导入语句(例如require 或define)的情况下使类型可用。
///<reference path="module.d.ts" />
您可以在编译期间自动生成定义文件,但出于您的目的,您可能希望手动启动自定义文件(取决于您希望如何使用它 - 预计会导入自动文件)。
ModuleA.ts
class ExampleOne {
doSomething() {
return 5;
}
}
export = ExampleOne;
ModuleB.ts
class ExampleTwo {
doSomething() {
return 'str';
}
}
export = ExampleTwo;
预期用途:
import B = require('moduleb');
var a = new ExampleOne();
var b = new B();
要完成这项工作,您需要创建您的 ModuleA.d.ts:
ModuleA.d.ts
declare class ExampleOne {
doSomething(): number;
}
然后像这样引用它:
/// <reference path="modulea.d.ts" />
import B = require('moduleb');
var a = new ExampleOne();
var b = new B();
【讨论】:
我不知道它是否回答了你的问题,但你可以添加一个类型定义文件:
/** mytype.d.ts */
interface MyType {
prop1: number,
prop2: string
}
export default MyType
并像这样在两个模块中导入它:
/** module1.ts */
import MyType from './mytype.d'
//use
let myVar: MyType
【讨论】: