【问题标题】:Typescript interface where key name has known prefix but full key is unknown密钥名称已知前缀但已知完整密钥的打字稿接口
【发布时间】:2021-09-14 17:22:06
【问题描述】:

有没有办法定义一个接口,其中键具有已知前缀(added_removed_)但完整键未知?

例如,一个有效的对象可能是:

{
   name: "",
   added_abc: [1,2,3],
   added_bcd: [2],
   removed_abcd: [4,5],
   removed_xyz: [],
}

我想确保一个接口:

interface myobject {
   name: string;
   added_*?: number[];
   removed_*?: number[];
}

【问题讨论】:

    标签: typescript


    【解决方案1】:

    TypeScript 4.4 发布后,您将能够利用 template string pattern literal index signatures,如在 microsoft/TypeScript#44512 中实现的那样,然后这将起作用:

    // TS4.4+
    interface MyObject {
      name: string;
      [k: `added_${string}`]: number[];
      [k: `removed_${string}`]: number[];
    }
    
    const myObject: MyObject = {
      name: "",
      added_abc: [1, 2, 3],
      added_bcd: [2],
      removed_abcd: [4, 5],
      removed_xyz: [],
    } // okay
    
    const myBadObject: MyObject = {
      name: "",
      added_abc: [1, 2, 3],
      addled_bcd: [2], // error!
    }
    

    在此之前,TypeScript 中没有特定类型可以代表您的要求。您可以在 TS4.1 到 TS4.3 中使用带有模板文字类型的 generic 辅助函数,但此类函数更复杂:

    // TS 4.1-4.3
    const asMyObject = <T extends { name: string } & { [K in keyof T]:
      K extends `added_${string}` | `removed_${string}` ? number[] :
      K extends "name" ? string :
      never }>(t: T) => t;
    
    const myObject2 = asMyObject({
      name: "",
      added_abc: [1, 2, 3],
      added_bcd: [2],
      removed_abcd: [4, 5],
      removed_xyz: [],
    }); // okay
    
    const myBadObject2 = asMyObject({
      name: "",
      added_abc: [1, 2, 3],
      addled_bcd: [2], // error!  
    });
    

    Playground link to code

    【讨论】:

      猜你喜欢
      • 2018-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-10
      • 2017-09-01
      • 1970-01-01
      相关资源
      最近更新 更多