gpt4 book ai didi

typescript - 'Class' 在它自己的类型注释中被直接或间接引用

转载 作者:搜寻专家 更新时间:2023-10-30 21:05:26 24 4
gpt4 key购买 nike

这是基本的 DI 模式:

class Foo {
foo = 1;
}

class Bar {
constructor(public Foo: typeof Foo) {
const foo = new Foo();
}
}

class Baz extends Foo {}
new Bar(Baz);

报错:

'Foo' is referenced directly or indirectly in its own type annotation.

但这显然不是自引用的,因为 public Foo 是属性名,而 typeof Foo 是类型。

这是怎么回事?是否是 TypeScript bug 有望在未来解决?是否记录在案?

Foo 属性名称可以以某种方式保留在这里而不重命名吗?这样命名才有意义。


看起来 public Foo: Foo 不会产生类型问题,Foo 指的是 中原始的 Foo 接口(interface)公共(public) AnotherFoo: Foo:

class Bar {
constructor(public Foo: Foo, public AnotherFoo: Foo) {
const foo: Foo = AnotherFoo;
foo.foo;
}
}

typeof Foo指的是Foo参数类型而不是原来的Foo接口(interface):

class Bar {
constructor(public Foo: number, Quux: typeof Foo) {
const quux: number = Quux;
}
}

最佳答案

问题是在构造函数中 Foo 将引用参数而不是类,所以你不能单独通过名称引用 Foo。做到这一点并保留参数名称的最简单方法是声明一个类型别名:

class Foo {
foo = 1;
}
type FooType = typeof Foo
class Bar {
constructor(public Foo: FooType) {
}
}

Foo : Foo 有效但 Foo: typeof Foo 无效的原因是在类型 : 之后需要一个类型注释。如果在搜索符号时注解是名称,则只有类型被认为是有效的。

typeof 之后,需要具有类型的符号名称(类、局部变量、参数等)。因此,搜索必须包含参数,并且 Foo 参数在范围内,因此必须加以考虑。

编辑

@artem 提出了一个很好的观点,我没有在上面明确指出:

[This behavior] is not specific to the constructors. In typeof Foo, Foo refer to the nearest value (not type) named Foo in the scope. Once you have a parameter named Foo, it's in the scope (you can even use it as default value to initialize other parameters), and it shadows any outer values named.

关于typescript - 'Class' 在它自己的类型注释中被直接或间接引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48640828/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com