如何让TypeScript编译器校验setConfigValue的键与值类型合法性?
解决方案
问题出在原函数的泛型约束逻辑上:value: ConfigType[keyof ConfigType] 是所有键对应类型的联合类型,只要值属于这个联合类型就不会报错,无法和传入的key做一对一的类型绑定。修改函数的泛型定义,引入额外的泛型参数来约束key,就能实现严格的编译时类型检查:
修改后的完整代码
export interface GCLPluginConfig { [key: string]: string | number | boolean | Date | string[]; } export interface CorePluginConfig extends GCLPluginConfig { "core.lastUpdateCheck": Date; } export interface AnsibleConfig extends GCLPluginConfig { "ansible.workingFolders": string[]; "ansible.defaultHost": string; "ansible.checkedAnsibleIntall": boolean; } public setConfigValue<ConfigType extends GCLPluginConfig, K extends keyof ConfigType>( key: K, value: ConfigType[K] ) { const config = this.getConfig(); config[key as string] = value; this.saveConfig(config); }
效果说明
- 错误key校验:当传入的key不属于
ConfigType定义的键时,编译器直接报错。比如调用this.configService.setConfigValue<AnsibleConfig>('ansible.invalidKey', []),会提示'ansible.invalidKey'不是AnsibleConfig的属性。 - 值类型不匹配校验:当传入的值类型和key对应的定义类型不一致时,编译器报错。比如给
'ansible.workingFolders'传入字符串'/path'而不是字符串数组,会提示类型不兼容。 - 自动类型推断:调用时可以省略泛型参数,TypeScript会根据传入的key自动推断对应的类型,简化调用:
this.configService.setConfigValue('ansible.workingFolders', ['/path/to/folder']);
这样就能完全满足你想要的编译时类型检查需求。
内容的提问来源于stack exchange,提问作者DTAP
相关产品推荐
相关产品推荐

