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
相关产品推荐
相关产品推荐

