繁体   English   中英

Typescript generics 和 keyof

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

TS游乐场链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM