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

如何定义TypeScript类型:仅order字段为字符串其余为数字?

TypeScript 特定字段类型定义问题解决方法

错误原因

你原来的写法里,ExcludeOrder<{ [key: string]: number }> 实际上还是一个索引签名类型 { [key: string]: number }。因为 keyof { [key: string]: number } 是 string 类型,Exclude<string, 'order'> 的结果依然是 string(string 是包含所有字符串字面量的无限集合,排除单个字面量后还是 string)。这就导致交叉类型时,order 字段同时被要求是 number(来自索引签名)和 string(来自单独定义的字段),类型冲突,所以报错。

解决方案

直接通过映射类型结合条件判断,一次性定义所有字段的类型:

type SpecificRecord = {
  [K in string]: K extends 'order' ? string : number;
};

// 合法示例
const record: SpecificRecord = {
  order: 'first',  
  amount: 100,
  price: 200,
  quantity: 300,
};

// 非法示例(会触发类型检查报错)
const invalidRecord: SpecificRecord = {
  order: 123, // 错误:'order' 必须是 string 类型
  amount: '100' // 错误:'amount' 必须是 number 类型
};

如果需要拆分逻辑,也可以用映射类型先定义数字字段,再合并 order 字段:

type NumericFields = { [K in string as Exclude<K, 'order'>]: number };
type SpecificRecord = NumericFields & { order: string };

这种写法和第一种效果一致,本质都是通过映射类型排除 order 后定义数字索引,再合并 order 的字符串类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 05:48:14