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

如何在不使用as const时让TypeScript函数推断只读字面量对象类型?

让TypeScript泛型函数自动推断对象属性字面量类型的方法

你当前的泛型函数声明:

declare function f<T extends object>(body: T): any;

调用时传入对象:

f({
  type: "object",
})

TypeScript会自动将type的类型拓宽为string,但你希望保留"object"字面量类型,且不想在调用时使用as const语法。

以下是两种可行的解决方案:

方案1:使用const泛型参数(TypeScript 5.0+)

给泛型参数添加const修饰符,强制TypeScript保留传入对象的字面量类型,避免自动拓宽:

declare function f<const T extends object>(body: T): any;

此时调用f({ type: "object" }),TypeScript的推断结果会变为:

function f<{
    readonly type: "object";
}>(body: {
    readonly type: "object";
}): any

完全符合你的预期,且无需在调用时额外添加语法。

方案2:将参数类型指定为Readonly

如果你的TypeScript版本低于5.0,可以通过把参数类型设置为Readonly<T>来触发字面量类型推断:

declare function f<T extends object>(body: Readonly<T>): any;

调用后同样会将type保留为"object"字面量类型,同时对象会被标记为只读。

原理说明:
默认情况下,TypeScript对非只读的对象字面量会进行类型拓宽(比如把具体字符串字面量转为string);而当参数是只读类型或使用const泛型时,TypeScript会保留原始字面量类型——因为只读意味着属性值不会被修改,不需要拓宽为更宽泛的类型。

内容的提问来源于stack exchange,提问作者Hello Hello

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 21:03:15