我想键入一个只能有"a"、"b"或"c"键的对象.

所以我可以这样做:

Interface IList {
    a?: string;
    b?: string;
    c?: string;
}

它们都是可选的!

type List = Record<'a' | 'b' | 'c', string>;

唯一的问题是需要定义所有键.所以我最终得到了

type List = Partial<Record<'a' | 'b' | 'c', string>>;

这是可行的,但我可以想象有一个更好的方法来做到这一点,而不需要部分.有没有其他方法可以让密钥在记录中成为可选的?

推荐答案

无法指定Record名成员的可选性.它们是定义所要求的

type Record<K extends keyof any, T> = {
    [P in K]: T; // Mapped properties are not optional, and it's not a homomorphic mapped type so it can't come from anywhere else.
};

如果这是一种常见的情况,您可以定义自己的类型:

type PartialRecord<K extends keyof any, T> = {
  [P in K]?: T;
};
type List =  PartialRecord<'a' | 'b' | 'c', string>

也可以使用预定义的映射类型定义PartialRecord:

type PartialRecord<K extends keyof any, T> =  Partial<Record<K, T>>

Typescript相关问答推荐

具有匹配键的通用对象界面

之间是否有区别:例如useEffect()React.useEffect()

在React中实现具有独立页面的嵌套路径的最佳实践是什么?

如何将类型从变量参数转换为返回中的不同形状?

访问继承接口的属性时在html中出错.角形

在函数中打字推断记录的关键字

带下拉菜单的Angular 响应式选项卡

如何避免推断空数组

部分更新类型的类型相等

如何将TS泛型用于react-hook-form接口?

对象类型的TypeScrip隐式索引签名

从route.参数获取值.订阅提供";无法读取未定义";的属性

为什么上下文类型在`fn|curred(Fn)`的联合中不起作用?

Angular NG8001错误.组件只能在一个页面上工作,而不是在她的页面上工作

编剧- Select 动态下拉选项

如何使函数参数数组不相交?

任何导航器都未处理有效负载为";params";:{";roomId";:";...";}}的导航操作

如何创建由一个帐户签名但使用另一个帐户支付的Hedera交易

两个接口的TypeScript并集,其中一个是可选的

广义泛型类型不加载抽象类型上下文