You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定义含部分已知键、其余键结构固定的TypeScript对象类型?

TypeScript 对象类型正确定义方案

场景回顾

需要定义一个对象类型:

  • 必含属性:foo(number类型)、bar(string类型)
  • 可选属性:键只能是baz/foobaz,或允许任意额外键,但所有可选属性的值必须是包含foobar(number类型)的对象

以下是两种对应需求的正确写法:


方案一:仅允许指定的可选属性(baz/foobaz)

如果只需要支持baz和foobaz作为可选属性,用交叉类型合并必选属性与映射类型即可解决原写法的语法冲突:

type MyList = 'baz' | 'foobaz';

type MyObject = {
  foo: number;
  bar: string;
} & {
  [key in MyList]?: {
    foobar: number;
  };
};

原理

将必选属性单独定义在一个对象类型中,再通过映射类型生成指定可选属性的类型,最后用交叉类型&合并两者,避开了在同一对象类型中混用显式属性与映射类型的语法限制。


方案二:允许任意符合结构的额外属性

如果需要支持任意字符串键的可选属性(只要值符合{foobar: number}结构),可以用条件映射类型+交叉类型实现:

type MyObject = {
  [K in string]?: 
    K extends 'foo' ? number : 
    K extends 'bar' ? string : 
    { foobar: number };
} & {
  // 强制foo、bar为必选属性
  foo: number;
  bar: string;
};

原理

  1. 用映射类型遍历所有字符串键,通过条件判断为不同键分配对应类型:foo设为number、bar设为string,其余键设为{foobar: number}且可选
  2. 通过交叉类型强制foo和bar为必选属性,覆盖映射类型中默认的可选设置

内容的提问来源于stack exchange,提问作者zkwsk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 15:36:19