[英]Typescript generics and keyof
我对keyof
和 generics 有疑问。 有两个对象:一个参数Config
,第二个结果MyFilter
。 MyFilter
应该使用Config
的键创建。 请帮忙:
enum Type {
Boolean,
Number,
String,
}
// f.e. { name: Type.String, age: Type.Number }
interface Config {
[key: string]: Type;
}
// should have the same keys as Config and corresponding types, f.e. { name: "Expecto Patronum!", age: 43 }
type MyFilter<C extends Config> = {
[Key in keyof C]: C[Key] extends Type.Boolean
? boolean
: C[Key] extends Type.Number
? number | null
: C[Key] extends Type.String
? string | null
: undefined;
};
// C and F should have same keys, but how to create F var and iterate over C to fill F with keyof
function createFilter<C extends Config = Config, F extends MyFilter<C> = MyFilter<C>>(config: C): F {
const filter = {}
// DO loop
switch (config[key]) {
case Type.Boolean:
filter[key] = true
case Type.Number:
filter[key] = 43
case Type.String:
filter[key] = "Expecto Patronum!"
}
// END loop
return filter
}
过滤器不必是通用的。 然后使用for...in可以遍历 object。 然后使用带有as
运算符的类型转换来断言类型。
function createFilter<C extends Config = Config>(config: C): MyFilter<C> {
const filter: Record<string, any> = {}
// DO loop
for (const key in config) {
switch (config[key]) {
case Type.Boolean:
filter[key] = true
case Type.Number:
filter[key] = 43
case Type.String:
filter[key] = "Expecto Patronum!"
}
}
// END loop
return filter as MyFilter<C>
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.