如何在不使用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
相关产品推荐
相关产品推荐

