TypeScript:从传入函数返回对象字面量时保留字面量类型信息
解决方案
要让工具函数保留传入函数返回值的字面量类型,你需要调整泛型参数的定义,利用TypeScript的const泛型约束返回类型的推导逻辑,避免字面量被自动拓宽。
正确的工具函数实现
const fixed = <const T, const R>(data: T, fn: (data: T) => R): R => { return fn(data) as R; }; // 调用后返回类型会保留字面量:{ readonly output: "out value" } const preservedType = fixed({ prop: "literal" }, data => ({ output: "out value" }));
为什么之前的写法失效?
- 第一个版本:
F extends (data: T) => any中的any会触发TypeScript的字面量自动拓宽机制(比如把"out value"转为string),直接丢失了字面量类型信息。 - 第二个版本:错误地将
F定义为泛型函数类型,但实际传入的是普通函数,导致类型不匹配触发报错。
可选优化(移除readonly修饰符)
如果不需要返回对象的readonly属性,可以通过类型工具移除该约束:
type Mutable<T> = { -readonly [K in keyof T]: T[K] }; const fixed = <const T, R>(data: T, fn: (data: T) => R): Mutable<R> => { return fn(data) as Mutable<R>; }; // 返回类型:{ output: "out value" } const preservedType = fixed({ prop: "literal" }, data => ({ output: "out value" }));
内容的提问来源于stack exchange,提问作者Jarek
相关产品推荐
相关产品推荐

