[英]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.