我有这个界面:
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
界面是什么样的。
但是有了这个:
interface Converter<T> {
converter: T;
}
而这些接口的State
,Water
和Version
:
interface State {
state: string;
}
interface Water {
water: string;
}
interface Version {
version: string;
}
你可以这样做:
function write<K extends keyof Api>(name: K, value: Api[K]["converter"]) {}
write("state", { state: "x" }); // Works
write("water", { state: "x" }); // Argument of type '{ state: string; }' is not assignable to parameter of type 'Water'.
write("water", { water: "x" }); // Works
但这会向您的Converter
界面添加一个属性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句