如何实现兼具类型安全与字面量推断的TypeScript函数?
如何实现兼具类型检查和字面量类型保留的TypeScript函数
你需要创建一个函数,既像Object.freeze那样能推断传入对象的字面量类型,又能对参数进行Partial<Group>的类型安全检查和智能提示,让返回值类型是具体的字面量类型而非拓宽后的类型。
现有方案的问题
- 直接用
Partial<Group>作为参数类型时,TypeScript会自动将传入的字面量拓宽为Partial<Group>,导致返回类型变成{id: string}而非预期的{id: "1"}。 - 使用
Object.freeze虽然能保留字面量类型,但无法对参数进行Partial<Group>的约束,缺少类型检查和智能提示。
解决方案:泛型约束+字面量类型保留
通过泛型约束实现两者的结合,代码如下:
interface Group { id: string; } // 泛型T约束为Partial<Group>,同时保留传入的字面量类型 const myFunction = <T extends Partial<Group>>(group: T) => Object.freeze(group); const group = myFunction({ id: "1" }); // typeof group = Readonly<{ id: "1" }>
工作原理
- 泛型
T被约束为Partial<Group>,确保传入的参数必须符合Group的部分属性结构:比如id必须是string类型,不能传入Group中不存在的属性,同时提供智能提示。 - 由于
T会被推断为传入的具体字面量类型(而非拓宽后的Partial<Group>),Object.freeze返回的Readonly<T>自然会保留字面量的具体类型,比如{id: "1"}。
验证类型检查效果
传入不符合约束的参数时,TypeScript会直接报错:
// 报错:类型'number'不能赋值给类型'string' myFunction({ id: 1 }); // 报错:对象字面量只能指定已知属性,'name'不在类型'Partial<Group>'中 myFunction({ name: "test" });
内容的提问来源于stack exchange,提问作者Ladislas Dellinger
相关产品推荐
相关产品推荐

