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

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" }));

为什么之前的写法失效?

  1. 第一个版本:F extends (data: T) => any 中的any会触发TypeScript的字面量自动拓宽机制(比如把"out value"转为string),直接丢失了字面量类型信息。
  2. 第二个版本:错误地将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 01:20:04