首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型抄本泛型和键

类型抄本泛型和键
EN

Stack Overflow用户
提问于 2022-08-18 13:55:48
回答 1查看 62关注 0票数 0

我对keyof和泛型有异议。有两个对象:一个参数Config,第二个结果MyFilterMyFilter应该用Config键创建。请帮助:

代码语言:javascript
复制
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
}

操场实例

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-20 23:48:19

过滤器没有必要成为泛型。然后,使用for...in,您可以迭代对象。然后利用带有as运算符的类型转换来断言类型。

代码语言:javascript
复制
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游乐场连接

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73404327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档