求助:TypeScript通过custom.d.ts增强TypographyProps变体失效
问题原因分析及修复方案
核心问题1:Merge类型逻辑错误
你当前的Merge类型返回的是对象类型,但TypographyProps['variant']需要的是字符串联合类型。看你的代码:
// 错误的类型推导逻辑 type Merge<X, Y> = { [K in keyof X | keyof Y]: | (K extends keyof X ? X[K] : never) | (K extends keyof Y ? Y[K] : never) } // TypographyProps里的variant实际类型是 { variant: 'variant-1'|... | 'variant-4'|... } // 而非期望的 'variant-1'|'variant-2'|'variant-3'|'variant-4'|... 联合类型 export interface TypographyProps { variant: Merge<DefaultVariant, VariantOverrides> }
这直接导致组件接收的variant参数类型完全不符合预期,类型增强自然无法生效。
核心问题2:模块增强的冗余写法
在web-1和web-2的类型增强代码里,import 'ui-library'是多余的,会干扰TypeScript的模块合并逻辑。正确的模块增强不需要在declare module块内重复导入目标模块。
修复步骤
步骤1:修正ui-library的类型定义
重新设计类型逻辑,让variant的类型是默认值与扩展值的字符串联合类型:
export interface DefaultVariant { variant: 'variant-1' | 'variant-3' | 'variant-2' } // 保留空接口用于外部扩展 export interface VariantOverrides {} // 提取默认variant类型 + 扩展的variant类型 type VariantType = DefaultVariant['variant'] | (VariantOverrides extends { variant: infer V } ? V : never); export interface TypographyProps { // 直接使用联合类型 variant: VariantType } export const Typography = ({ variant }: TypographyProps) => { return <div>{variant}</div> }
步骤2:修正web-1/web-2的类型增强代码
去掉冗余的import语句,直接扩展VariantOverrides:
// web-1/src/typings/ui-library.d.ts declare module 'ui-library' { export interface VariantOverrides { variant: 'variant-4' | 'variant-5' } }
// web-2/src/typings/ui-library.d.ts declare module 'ui-library' { export interface VariantOverrides { variant: 'variant-55' | 'variant-46' } }
步骤3:确保monorepo类型引用正确
确保web-1和web-2的tsconfig.json中正确配置了对ui-library的引用,比如通过compilerOptions.paths或者monorepo workspace的自动映射,让TypeScript能识别到ui-library的类型定义和增强代码。
验证效果
修复后,在web-1中使用Typography组件时,variant的可选值会包含'variant-1'|'variant-2'|'variant-3'|'variant-4'|'variant-5';web-2中则会包含'variant-1'|'variant-2'|'variant-3'|'variant-55'|'variant-46',实现了预期的类型增强效果。
内容的提问来源于stack exchange,提问作者Jakub Kontra
相关产品推荐
相关产品推荐

