【发布时间】:2018-02-06 20:40:59
【问题描述】:
这是基本的 DI 模式:
class Foo {
foo = 1;
}
class Bar {
constructor(public Foo: typeof Foo) {
const foo = new Foo();
}
}
class Baz extends Foo {}
new Bar(Baz);
它给出了一个错误:
'Foo' 在它自己的类型注解中被直接或间接引用。
但它显然不是自引用的,因为public Foo 是属性名称,typeof Foo 是类型。
这里发生了什么?是预计将来会解决的 TypeScript 错误吗?有记录吗?
Foo 属性名称可以以某种方式保留在这里而不重命名吗?这样命名才有意义。
看来public Foo: Foo 不会产生类型问题,而Foo 指的是public AnotherFoo: Foo 中的原始Foo 接口:
class Bar {
constructor(public Foo: Foo, public AnotherFoo: Foo) {
const foo: Foo = AnotherFoo;
foo.foo;
}
}
而typeof Foo指的是Foo参数类型而不是原来的Foo接口:
class Bar {
constructor(public Foo: number, Quux: typeof Foo) {
const quux: number = Quux;
}
}
【问题讨论】:
-
你为什么要在类声明中推断类型定义?这是多余的。 TSlint 插件会给你一个冗余定义类型的例外:例如
let variable1: boolean = true是冗余的。对于 Classes,这是一个例外,因为您正在引用他的类型和参数。只需声明一个类型_Foo = typeof Foo并将其提供给您的类参考 - 编辑没有在下面看到答案。提香是对的 -
type _Foo是一个很好的解决方法。但是这个类型定义怎么是多余的呢?如果我不指定public Foo的类型,它将是any。我没有public Foo = initialValue来推断类型。
标签: typescript dependency-injection