在Typescript中提取静态成员类对象的类型

时间:2019-02-08 11:50:18

标签: typescript

如果我有这个intefaceclass

interface MyInterface {
  prop1: boolean;
  prop2: string
}

class MyClass {
  static readonly Something: MyInterface;
  static readonly AnotherThing: MyInterface;
}

是否可以定义一个变量,该变量需要是MyClass的静态成员和prop的特定MyInterface

const myProp2: Some_Type_with_prop2 = MyClass.Something.prop2 // valid
const myProp2: Some_Type_with_prop2 = MyClass.AnotherThing.prop2 // valid
const myProp1: Some_Type_with_prop1 = MyClass.Something.prop2 // invalid
const myProp1: Some_Type_with_prop1 = MyClass.AnotherThing.prop2 // invalid
const myProp2_2: Some_Type_with_prop2 = 'hello' // invalid

无论如何。 SomethingAnotherThing部分是我需要动态获取的内容:

<Myclass,'prop2'> ->  MyClass.xxxxx.prop2 

2 个答案:

答案 0 :(得分:3)

您可以尝试以下操作:

interface MyInterface {
    prop1: boolean;
    prop2: string;
}

class MyClass {
  static readonly something: MyInterface;
  static readonly anotherThing: MyInterface;
}

type PropOne = typeof MyClass["something"]["prop1"];
type PropTwo = typeof MyClass["something"]["prop2"];

const myProp2: PropTwo = MyClass.something.prop2; // valid
const myProp1: PropOne = MyClass.something.prop2; // invalid
const myProp2_2: PropTwo = 'hello'; // invalid

如果您想要更通用的东西,可以定义以下类型:

type SubPropType<T, K extends keyof T, K2 extends keyof T[K]> = T[K][K2];

并按如下所示使用它:

type PropOne = SubPropType<typeof MyClass, "something", "prop1">;
type PropTwo = SubPropType<typeof MyClass, "something", "prop2">;

如果您不想创建类型别名,则无需创建别名。这些类型可以在以下行中使用:

const myProp2: SubPropType<typeof MyClass, "something", "prop1"> = MyClass.something.prop2; // valid
const myProp1: SubPropType<typeof MyClass, "something", "prop2"> = MyClass.something.prop2; // invalid
const myProp2_2: SubPropType<typeof MyClass, "something", "prop2"> = 'hello'; // invalid

我认为不可能仅使用子道具的名称来动态获取第一级道具。

答案 1 :(得分:0)

使用类型索引或

可以实现
const myProp2: MyInterface['prop2'] = MyClass.Something.prop2 // valid 
const myProp1: MyInterface['prop1'] = MyClass.Something.prop2 // invalid 
const myProp2_2: MyInterface['prop2'] = 'hello' // invalid