TypeScript对象展开未校验扩展类型属性,如何实现缺失属性提示?
问题解决方案
问题根源
- 原泛型函数的
props参数被标注为any类型,TypeScript 会关闭针对any类型的所有静态校验规则,因此即便传入的属性缺失必填字段也不会触发警告。
修改方案
将props的类型替换为Omit<T, 'id'>,该工具类型会自动排除由函数内部生成的id字段,要求传入的props匹配目标类型除id外的所有属性约束:
function createThing<T extends IThing>( // 排除内部生成的id,剩余属性都要求用户传入符合类型要求的值 props: Omit<T, 'id'> ): T { return { id: newId(), ...props } as T; }
如果需要支持不传props的默认值场景,可以调整为:
function createThing<T extends IThing>( props: Omit<T, 'id'> = {} as Omit<T, 'id'> ): T { return { id: newId(), ...props } as T; }
校验效果
修改后再调用示例代码时,TypeScript会直接抛出错误提示,要求传入缺少的必填属性a2:
// 会触发TS警告:类型 "{ a1: string; }" 缺少类型 "Omit<IThingA, "id">" 中的以下属性: a2 const thing: IThingA = createThing<IThingA>({a1: 'red'});
内容的提问来源于stack exchange,提问作者user1843640
相关产品推荐
相关产品推荐

