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

如何实现兼具类型安全与字面量推断的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" }>

工作原理

  1. 泛型T被约束为Partial<Group>,确保传入的参数必须符合Group的部分属性结构:比如id必须是string类型,不能传入Group中不存在的属性,同时提供智能提示。
  2. 由于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 10:48:11