代码之家  ›  专栏  ›  技术社区  ›  ThomasReggi

我在找一个'PickOptional<T,K>'通用的

  •  2
  • ThomasReggi  · 技术社区  · 3 年前

    下面我有一个界面,我正在从中挑选声音,我想要一个泛型来代替pick/wrapp,1)获取任何字符串键(当前在'cluck'上键入错误,2)不放置未知属性,只需将其忽略即可。

    interface Sounds {
        'meow': true
        "woof": false
    }
    
    type Sound = Pick<Sounds, 'woof' | 'cluck'>
    //                                    /.\
    //                                     |
    // type Sound = {                  This throws 
    //     woof: false;                    
    //     cluck: unknown; <!--- I don't want this
    // }
    
    2 回复  |  直到 3 年前
        1
  •  0
  •   Robby Cornelissen    3 年前

    使用 Pick<Type, Keys> 具有 Extract<Type, Union> 要过滤掉不需要的密钥,请执行以下操作:

    interface Sounds {
        meow: true;
        woof: false;
    }
    
    type PickOptional<T, U> = Pick<T, Extract<U, keyof T>>;  
    
    type Sound = PickOptional<Sounds, 'woof' | 'cluck'>;
    
    /* Evaluates to: 
    type Sound = {
      woof: false;
    }
    */
    
        2
  •  0
  •   arvymetal    3 年前

    我建议创建一个中间层 选择 输入,使用 conditional types .

    interface Sounds {
        'meow': true
        "woof": false
    }
    
    type PickIfExists<T, U> = Pick<T, U extends keyof T ? U : never>
    type Sound = PickIfExists<Sounds, 'woof' | 'cluck'>
    
    // type Sound = {
    //   woof: false;
    // }
    

    测试一下 Typescript Playground .