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

能否创建已知对象类型与索引签名的交叉类型?

实现固定属性+索引签名的约束类型

直接交叉{ a: string } & { [prop: string]: number }在TypeScript里走不通,因为索引签名要求所有属性类型都得兼容于它的类型,而string和number不兼容,最终这个交叉类型会变成never,根本没法正常使用。

要实现「固定属性严格遵循指定类型,其余任意属性必须符合索引签名类型」的需求,可以用条件类型结合索引签名来定义:

通用工具类型

// 泛型工具:固定属性遵循T的类型,其余string属性必须为number
type StrictObjectWithIndex<T extends Record<string, unknown>> = {
  [K: string]: K extends keyof T ? T[K] : number;
};

// 定义你的固定属性类型
type Bar = { a: string };
// 生成目标类型
type FooBar = StrictObjectWithIndex<Bar>;

测试验证

const fooBar1: FooBar = { a: 'hello', b: 1 }; // ✅ 符合要求,正常通过
const fooBar2: FooBar = { a: 'hello', b: 1, c: 'a' }; // ❌ 报错:c的类型string不符合number要求
const fooBar3: FooBar = { a: 1, b: 1 }; // ❌ 报错:a的类型number不符合string要求

原理说明

这个类型的核心是利用TypeScript的条件类型和索引签名结合:

  • 索引签名[K: string]覆盖所有string类型的属性名
  • 通过K extends keyof T ? T[K] : number做分支判断:
    • 如果属性名是T中定义的固定属性(比如示例里的a),则类型严格遵循T中定义的类型(string)
    • 否则,属性类型必须是number

这样既保证了固定属性的类型准确性,又约束了其他任意属性的类型,完全匹配你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 00:15:03