如何基于const对象声明JSDoc类型,避免重复修改类型定义?
基于现有const对象直接推导JSDoc类型,避免重复定义
当然可以,完全不需要单独维护typedef和对象的同步,直接利用typeof操作符就能基于对象本身推导类型,下面是几种实用的实现方式:
方式一:直接引用对象的类型
不需要额外定义typedef,直接在函数参数里用keyof typeof options指定键类型:
const options = { key1: "val1", key2: "val2", key3: "val3" }; /** * @param {keyof typeof options} key */ function func(key){ /* ... */ return 0 }
后续修改options的键集合时,key的参数类型会自动同步,不用手动修改类型定义。
方式二:更严格的字面量类型(可选)
如果需要让键的类型是具体的字符串字面量(比如"key1"|"key2"|"key3")而非宽泛的string,可以用as const断言把对象转为只读字面量类型:
const options = { key1: "val1", key2: "val2", key3: "val3" } as const; /** * @param {keyof typeof options} key */ function func(key){ /* ... */ return 0 }
这种方式下编辑器会给出更精准的代码提示,同时禁止修改options的属性值,避免意外改动。
方式三:复用对象类型(可选)
如果还是需要一个命名的类型来复用,可以用@typedef直接引用typeof options:
const options = { key1: "val1", key2: "val2", key3: "val3" }; /** @typedef {typeof options} optionsType */ /** * @param {keyof optionsType} key */ function func(key){ /* ... */ return 0 }
这样optionsType会自动跟随options的结构变化,不用手动维护类型定义。
内容的提问来源于stack exchange,提问作者vanilla
相关产品推荐
相关产品推荐

