如果我有这个inteface
和class
:
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
无论如何。 Something
和AnotherThing
部分是我需要动态获取的内容:
<Myclass,'prop2'> -> MyClass.xxxxx.prop2
答案 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