如何让JSDoc/TypeScript泛型参数隐式解析为字面量类型?
解决泛型参数隐式解析为字面量类型的问题
首先修正你的JSDoc写法,函数参数需用@param而非@property,之后可通过以下两种方式实现字面量类型的隐式推断:
方法一:使用const泛型参数(TypeScript 5.0+ 支持)
通过@template {const} T约束泛型参数,让TypeScript自动将传入的对象字面量推断为字面量类型(会带有readonly修饰):
/** * @template {const} T * @param {T} o * @returns {T} */ function myFunction(o) { // ...doStuff return o; } // 调用示例 const res = myFunction({x:1,y:2,z:3}); // res的类型会被推断为:{ readonly x: 1; readonly y: 2; readonly z: 3; }
方法二:兼容低版本TypeScript的写法
如果你的TypeScript版本低于5.0,可在调用时通过as const断言强制字面量类型推断:
/** * @template T * @param {T} o * @returns {T} */ function myFunction(o) { // ...doStuff return o; } // 调用示例 const res = myFunction({x:1,y:2,z:3} as const); // res的类型会被推断为:{ readonly x: 1; readonly y: 2; readonly z: 3; }
若不需要readonly修饰符,可手动移除:
type Mutable<T> = { -readonly [K in keyof T]: T[K] }; /** * @template {const} T * @param {T} o * @returns {Mutable<T>} */ function myFunction(o) { // ...doStuff return {...o} as Mutable<T>; } const res = myFunction({x:1,y:2,z:3}); // res的类型会被推断为:{ x: 1; y: 2; z: 3; }
内容的提问来源于stack exchange,提问作者tzuleger
相关产品推荐
相关产品推荐

