【问题标题】:Typescript - type definition for own classes without importing themTypescript - 自己的类的类型定义而不导入它们
【发布时间】:2016-05-30 14:43:15
【问题描述】:

我在 typescript 中使用依赖注入,这意味着我可以在模块中创建一个对象而无需导入类(我正在导入一个注入器,而不是它为我提供了我需要的对象实例)。如果我现在想为接收变量提供一个类型,我会收到 Unresolved type 错误。有什么好的解决办法吗?

示例

Injector.injectMainHelper(); 返回一个 'MainHelper' 类型的对象,但当前模块不知道该类型,因为我还没有导入 MainHelper(我不想导入它)。

let mainHelper:MainHelper = Injector.injectMainHelper();

您可以查看完整代码here

【问题讨论】:

  • 您使用的是哪个 IoC 容器?角 2?
  • 不,我只是为了好玩而尝试了DIY DI。所以没有容器或框架。
  • 我已经在容器上工作了一段时间了,现在你可以在github.com/inversify/InversifyJS 上查看它,我也建议你阅读blog.wolksoftware.com/… 第二点解释了你在这里遇到的问题以及原因需要接口。
  • @OweRReLoaDeD 谢谢。我已经尝试过 inversify,在我看来这太神奇了。不要误会我的意思,我不想说它不好,它只是增加了另一层复杂性。感谢您将我指向博客,我会检查一下。我想一切都会归结为到处使用接口。
  • 没问题!你在做正确的事,如果你不完全知道发生了什么,那么“使用魔法”是不好的。

标签: javascript types typescript


【解决方案1】:

声明接口怎么样?

interfaces.d.ts

interface IMainHelper {
    //... 
}

main_helper.ts

class MainHelper implements IMainHelper {
    //... 
}

other_file.ts

/// <reference path="./interfaces.d.ts" />

import Injector from "./injector";

let mainHelper: IMainHelper = Injector.injectMainHelper();

注意:如果您添加对 tsconfig.json 的引用,则无需将其添加到文件中。

更新

我刚试过,如果你有两个文件:

test1.ts

class MainHelper {

}

var Injector = {
    injectMainHelper: function() {
        return new MainHelper();
    }
}

export default Injector;

test2.ts

import Injector from "./test1";

let mainHelper = Injector.injectMainHelper(); // mainHelper is MainHelper

TypeScript 能够推断mainHelper 的类型。如果你不添加类型,编译器会自动检测它的类型。

如果你有更通用的东西,比如:

var Injector = {
    injectSomething: function(somethingID) {
        // find something and dependencies
        return new Something(..dependencies);
    }
}

解决方案是使用泛型:

let mainHelper = Injector.injectSomething<MainHelper>("mainHelperID");

但在这种情况下,您将再次需要接口...

【讨论】:

  • 感谢您的回答。能否请您添加定义文件?
  • 定义文件为interfaces.d.ts
  • Foo,对不起....今天工作了 8 个小时,我的大脑一片混乱... :)。好的,这也有助于不依赖于具体,而是依赖于抽象。我会将其合并到我的项目中并报告回来。谢谢。
  • 工作。非常感谢。