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

TypeScript中非精确对象:指定单个属性类型并保留自动推断

TypeScript 单独指定对象属性类型同时保留其他属性自动推断

有几种实用的方式可以在保留其他属性自动推断的前提下,单独约束type属性为InputType类型:

方式一:直接给单个type字段加类型断言

type InputType = 'text' | 'number';

const arr = [
  { label: 'Set', value: setNumber, id: 'setNumber', set: setSetNumber, type: 'text' as InputType },
  { label: 'Name', value: name, id: 'name', set: setName, type: 'text' as InputType },
  { label: 'Source', value: source, id: 'source', set: setSource, type: 'text' as InputType }
];

这种方式简单直接,只针对type字段做类型断言,其余属性的类型依然由TypeScript自动推断,不会丢失原有类型信息。

方式二:用泛型辅助函数批量约束

type InputType = 'text' | 'number';

// 泛型函数仅约束type属性,其余属性自动推断
const createInputItem = <T extends { label: string; id: string; value: unknown; set: unknown }>(
  item: T & { type: InputType }
) => item;

const arr = [
  createInputItem({ label: 'Set', value: setNumber, id: 'setNumber', set: setSetNumber, type: 'text' }),
  createInputItem({ label: 'Name', value: name, id: 'name', set: setName, type: 'text' }),
  createInputItem({ label: 'Source', value: source, id: 'source', set: setSource, type: 'text' })
];

通过泛型函数createInputItem,我们只限制type必须符合InputType,其余属性的类型完全由TS自动推导。后续如果要修改某个项的type为'number',TS会自动校验合法性,同时不影响其他属性的类型推断。

方式三:基于自动推断类型扩展约束

type InputType = 'text' | 'number';

// 先让TS自动推断数组项的基础类型
const tempArr = [
  { label: 'Set', value: setNumber, id: 'setNumber', set: setSetNumber, type: 'text' },
  { label: 'Name', value: name, id: 'name', set: setName, type: 'text' },
  { label: 'Source', value: source, id: 'source', set: setSource, type: 'text' }
];
type BaseInputItem = typeof tempArr[0];
// 移除原有type属性,重新指定为InputType
type ConstrainedInputItem = Omit<BaseInputItem, 'type'> & { type: InputType };

// 最终数组指定为约束后的类型
const arr: ConstrainedInputItem[] = tempArr;

这种方式先通过临时数组让TS自动推断出所有属性的基础类型,再通过Omit替换type的类型约束,适合需要复用约束后类型的场景,同样保留了其他属性的自动推断结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 02:37:31