通过对象属性设置变量的类型

时间:2019-04-21 09:49:12

标签: typescript

我正在尝试将变量的类型设置为对象的属性,例如下面的代码。

class Foo {

}

const obj = {
  Foo,
};

const foo: Foo; // valid
const bar: obj.Foo; // Cannot find namespace 'obj'.

这给了我错误Cannot find namespace 'obj'。有没有一种方法可以通过对象属性设置变量的类型,例如foobar的类型为Foo

3 个答案:

答案 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"];

注意barconstructor,而不是实例。

如果您要查找实例类型,则可以使用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;