打字稿:根据接口键获取接口类型 属性
Typescript: get type of interface property based on interface key
我正在构建一个需要一次更新对象的一个字段的函数。
此对象是通过接口 T
.
定义的
interface T {
a: TypeA;
b: TypeB;
c: TypeC;
}
这应该是这个函数的类型签名:
(key: keyof T, value: typeof T[key]) => void
这会产生错误:'key' refers to a value, but it is being used as a type here. Did you mean 'typeof key'?
。 IMO 我不是说 typeof key
,因为 typeof key
是 T
的任何键,但我希望 value
属性是 TypeA
类型,如果 key = a
,等等
如何selectT
对应键值的类型?
您正在尝试为具有真实值的类型编制索引,这是不允许的。您需要使用类型 (playground):
访问它
interface T {
a: number;
b: string;
c: boolean;
}
const func = <K extends keyof T>(key: K, value: T[K]) => {};
func("a", 5);
func("b", 5); // Argument of type 'number' is not assignable to parameter of type 'string'.
打字稿中的类型和实际值之间有明显的区别,因为类型信息在转译后会丢失。因此,您不能使用实数值来定义类型逻辑。唯一的方法是提取真实值的类型值(例如,使用 typeof
),这就是编译器建议将您的真实值转换为类型的原因。
我正在构建一个需要一次更新对象的一个字段的函数。
此对象是通过接口 T
.
interface T {
a: TypeA;
b: TypeB;
c: TypeC;
}
这应该是这个函数的类型签名:
(key: keyof T, value: typeof T[key]) => void
这会产生错误:'key' refers to a value, but it is being used as a type here. Did you mean 'typeof key'?
。 IMO 我不是说 typeof key
,因为 typeof key
是 T
的任何键,但我希望 value
属性是 TypeA
类型,如果 key = a
,等等
如何selectT
对应键值的类型?
您正在尝试为具有真实值的类型编制索引,这是不允许的。您需要使用类型 (playground):
访问它interface T {
a: number;
b: string;
c: boolean;
}
const func = <K extends keyof T>(key: K, value: T[K]) => {};
func("a", 5);
func("b", 5); // Argument of type 'number' is not assignable to parameter of type 'string'.
打字稿中的类型和实际值之间有明显的区别,因为类型信息在转译后会丢失。因此,您不能使用实数值来定义类型逻辑。唯一的方法是提取真实值的类型值(例如,使用 typeof
),这就是编译器建议将您的真实值转换为类型的原因。