【问题标题】:Import external definitions导入外部定义
【发布时间】:2020-06-11 22:42:57
【问题描述】:

使用 Typescript,有没有办法只从外部模块导入类型?

基本上,我只希望一个模块知道另一个模块的类型(以支持 Intellisense),但不会在 JavaScript 中发出导入。我想这样做是因为有问题的模块可能已加载也可能未加载 - 即没有硬依赖,但我希望有一些类型的代码可以运行并使用该模块(如果存在)。

希望这很清楚。

【问题讨论】:

  • 为什么这被否决了?

标签: typescript typescript1.4


【解决方案1】:

您可以将定义文件与参考注释一起使用,这样就可以在不添加任何导入语句(例如requiredefine)的情况下使类型可用。

///<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();

【讨论】:

  • 我认为这不适用于外部模块?我以为只是内部的。有空我会试试看的!
  • 我已经扩展了一个例子来展示如何做到这一点。
  • 谢谢。这似乎可行,但不幸的是,自动生成的 .d.ts 文件包含“export =”行,这似乎阻止了类型通过。我会在 GitHub 上提出这个问题。
  • 自动生成的将适合导入,而不是引用(这对正常用例有意义)
【解决方案2】:

我不知道它是否回答了你的问题,但你可以添加一个类型定义文件:

/** mytype.d.ts */
interface MyType {
  prop1: number,
  prop2: string
}

export default MyType

并像这样在两个模块中导入它:

/** module1.ts */
import MyType from './mytype.d'

//use
let myVar: MyType

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-07
    • 2021-02-05
    • 1970-01-01
    • 2022-11-25
    • 2021-12-29
    • 2017-09-23
    • 1970-01-01
    • 2019-08-29
    相关资源
    最近更新 更多