我正在尝试将变量的类型设置为对象的属性,例如下面的代码。
class Foo {
}
const obj = {
Foo,
};
const foo: Foo; // valid
const bar: obj.Foo; // Cannot find namespace 'obj'.
这给了我错误Cannot find namespace 'obj'
。有没有一种方法可以通过对象属性设置变量的类型,例如foo
和bar
的类型为Foo
?
答案 0 :(得分:2)
无法将类型添加到对象类型。您可以做的最接近的事情是使用名称空间定义。名称空间可以同时具有变量和类型。名称空间在运行时被表示为对象,因此它可能与您所需要的足够接近:
class Foo {
}
type _Foo = Foo;
const _Foo = Foo;
namespace obj {
export type Foo = _Foo;
export const Foo = _Foo; // to allow instantiation through obj.Foo
};
const foo: Foo; // valid
const bar: obj.Foo = new obj.Foo()
答案 1 :(得分:2)
首先,您需要获取obj
的类型(使用typeof
),然后可以查询其Foo
属性类型:
declare const bar: (typeof obj)["Foo"];
注意bar
是constructor
,而不是实例。
如果您要查找实例类型,则可以使用InstanceType
实用程序:
declare const bar: InstanceType<(typeof obj)["Foo"]>;
如果您需要更多可重用的内容:
type Obj = typeof obj;
type GetType<K extends keyof Obj> = InstanceType<Obj[K]>
const bar: GetType<'Foo'> = new obj.Foo();
答案 2 :(得分:0)
您可以像let bar: {Foo}
更新
此外,由于我提到obj
不是名称空间,因此我尝试使用typeof
关键字,因为我们想要该属性的type
。所以你可以这样尝试
let bar: typeof obj.Foo;