TS:如何使返回类型成为带有枚举键的接口类型 属性
TS: How to make returning type be a type of interface property with enum keys
我的目标是使用 prop_key 和 prop_value 参数创建一个集合方法,这些参数根据 prop_key 的值决定 prop_value 的类型。
我希望它使用枚举作为 prop 名称,使用接口作为 prop 值的类型。
我想做的事情:
enum Property {
A = 0,
B,
C
}
interface PropertyStorage {
[Properties.A]: number;
[Properties.B]: string;
[Properties.C]: boolean;
}
setProperty(name: Property, value: TypeOfThisPropertyInStorage?): void
// Example
// setProterty(Propert.A, value => number)
// setProterty(Property.B, value => string)
// setProterty(Property.C, value => boolean)
最近我尝试过:
setProperty(name: Property, value: Pick<PropertyStorage , typeof name>): void
但是当我尝试使用它时,我得到:
setProperty(Property.A, 15)
// Argument of type 'number' is not assignable to parameter of type 'Pick<PropertyStorage , Property>'.
如@captain-yossarian所述-解决方案是
enum Property {
A = 0,
B,
C
}
interface PropertyStorage {
[Property.A]: number;
[Property.B]: string;
[Property.C]: boolean;
}
const setProperty = <Name extends keyof PropertyStorage>(name: Name, value: PropertyStorage[Name]) => {
}
setProperty(Property.A, 42)
我的目标是使用 prop_key 和 prop_value 参数创建一个集合方法,这些参数根据 prop_key 的值决定 prop_value 的类型。
我希望它使用枚举作为 prop 名称,使用接口作为 prop 值的类型。
我想做的事情:
enum Property {
A = 0,
B,
C
}
interface PropertyStorage {
[Properties.A]: number;
[Properties.B]: string;
[Properties.C]: boolean;
}
setProperty(name: Property, value: TypeOfThisPropertyInStorage?): void
// Example
// setProterty(Propert.A, value => number)
// setProterty(Property.B, value => string)
// setProterty(Property.C, value => boolean)
最近我尝试过:
setProperty(name: Property, value: Pick<PropertyStorage , typeof name>): void
但是当我尝试使用它时,我得到:
setProperty(Property.A, 15)
// Argument of type 'number' is not assignable to parameter of type 'Pick<PropertyStorage , Property>'.
如@captain-yossarian所述-解决方案是
enum Property {
A = 0,
B,
C
}
interface PropertyStorage {
[Property.A]: number;
[Property.B]: string;
[Property.C]: boolean;
}
const setProperty = <Name extends keyof PropertyStorage>(name: Name, value: PropertyStorage[Name]) => {
}
setProperty(Property.A, 42)