我有这个界面:
interface Api {
state: Converter<State>;
water: Converter<Water>;
version: Converter<Versions>;
}
我有一个名为 write
的函数
write(name, value);
现在我想要实现的是 value
的类型根据第一个参数( name
),应该是 Converter 的泛型。
所以如果我调用 write("state", value)
-> value
应该是 State
. "water"
也是如此和 "version"
.
write("state, value); // value should be type of State
write("water", value); // value should be type of Water
write("version", value); // value should be type of Versions
我这样实现了第一个参数:
write(name: keyof Api, value: ???)
我发现我可以得到对应的值到keyof Api
像这样:
write<K extends keyof Api>(name: K, value: Api[K])
但这给了我 Converter<State>
对于 "state"
.有没有一种方法可以访问 Converter
中的泛型? ?
最佳答案
如果您有权访问 Converter iterface/type 或使用此类型扩展它的其他内容
或者像这样创建扩展接口(interface)
interface Converter<T> {
p1: any;
p2: any;
}
interface IExtendedConverter<T> extends Converter<T> {
type: T;
}
interface IApi {
state: IExtendedConverter<string>;
water: IExtendedConverter<number>;
}
const write = <K extends keyof IApi>(name: K, value: IApi[K]['type']) => {
return;
};
const str = write('state', '1'); // here value has to be string
const num = write('water', 1); // here value has to be number
根据问题编辑
一个解决方案是定义这个参数
const extendedConverterState: IExtendedConverter<string> = {
...converter,
type: '',
};
const extendedConverterNumber: IExtendedConverter<number> = {
...converter,
type: 1,
};
const api: IApi = {
state: extendedConverterState,
water: extendedConverterNumber,
};
这在某种程度上是迟钝的解决方案,因为您只会创建永远不会被使用的属性。
其他解决方案可以是将类型参数创建为 optionla
interface IExtendedConverter<T> extends Converter<T> {
type?: T;
}
但是这个 souliton 会把你在写函数中的参数设置为可选(可能未定义)
也许有更好的解决方案来访问这个通用类型。 idk
关于TypeScript:读取对象中值的通用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56663663/