【问题标题】:Get keys of Record<string, {}> (or define object with inferred keys and typed values) in TypeScript在 TypeScript 中获取 Record<string, {}> 的键(或使用推断的键和键入的值定义对象)
【发布时间】:2023-04-01 07:10:01
【问题描述】:

我有一个接口 MyInterface 和该接口的字符串键的 const/readonly 字典。

interface MyInterface {
  someProp: number;
}

const MyObj: Record<string, MyInterface> = {
  myKey1: { someProp: 1 },
  myKey2: { someProp: 2 },
} as const;

现在我想创建一个type,它是MyObj 的键。

type MyKeys = keyof typeof MyObj; // MyKeys = string

或者,我可以做到

const MyObj = {
  myKey1: { someProp: 1 },
  myKey2: { someProp: 2 },
} as const;

type MyKeys = keyof typeof MyObj; // MyKeys = 'myKey1' | 'myKey2'

这为我们提供了所需的类型,但并未为我们提供MyObj 内的类型安全性。

不出所料,这不起作用。

const MyObj: Record<keyof typeof MyObj, MyInterface> = {
  // ...
}

有没有办法在事先不知道密钥的情况下同时获得类型安全和密钥?最好,我想在没有包装函数的情况下执行此操作,但如果没有其他方法,我也许可以说服我的团队这样做是值得的。

【问题讨论】:

    标签: typescript


    【解决方案1】:

    我确实想出了一种使用包装函数的方法,但就像我在 OP 中所说的那样,我宁愿不使用这种方法。

    interface MyInterface {
      someProp: number;
    }
    
    function makeMyObj<T extends Record<string, MyInterface>>(obj: T): { [key in keyof T]: T[key] } {
      return obj;
    }
    
    const MyObj = makeMyObj({
      myKey1: { someProp: 1 },
      myKey2: { someProp: 2 },
    });
    
    type MyKeys = keyof tyepof MyObj;
    

    这种方法也不能保证我们完全的类型安全,因为它不会阻止在对象中添加附加属性。

    我还遇到了一个问题,因为我希望 MyInterface 包含一个 MyKeys 类型的成员,这会创建一个递归定义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 2021-03-16
      • 2022-08-09
      • 2020-02-16
      相关资源
      最近更新 更多