TypeScript泛型函数中枚举结合条件类型报错问题排查
错误原因分析:TypeScript泛型条件类型中的枚举赋值问题
你的代码回顾
枚举定义:
export enum FactoryResult { INTERNAL_FORMALITY_CREATED_WITH_DOCS, INTERNAL_FORMALITY_INVALID_DOCS, INTERNAL_FORMALITY_MISSING_DOCS, }
函数代码:
public fromData<T extends FactoryResult>( data: FormalityCreationDTO, filesAttachments: FileAttachment[], ): { factoryResult: T; formality: T extends FactoryResult.INTERNAL_FORMALITY_MISSING_DOCS ? never : Formality; invalidDocuments: T extends FactoryResult.INTERNAL_FORMALITY_MISSING_DOCS ? never : FileAttachment[]; } { if (filesAttachments.length < NumberOfFilesRequiredForCreation.TEST) { return { factoryResult: FactoryResult.INTERNAL_FORMALITY_MISSING_DOCS, // <= 报错位置 }; // ...其他分支 }}
错误核心原因
泛型参数的控制权在调用者
你定义的泛型T extends FactoryResult,意味着调用该函数时,调用者可以指定T为FactoryResult中的任意枚举成员。比如调用者可能写:fromData<FactoryResult.INTERNAL_FORMALITY_CREATED_WITH_DOCS>(data, files)此时函数的返回类型要求
factoryResult必须是INTERNAL_FORMALITY_CREATED_WITH_DOCS,但你在分支里硬返回了INTERNAL_FORMALITY_MISSING_DOCS,这就违反了泛型约定,TypeScript会抛出类型不匹配的错误。never类型的误用
你试图用never表示不需要返回的属性,但TypeScript中never类型的属性是不允许存在的,而不是可以省略。当T不是INTERNAL_FORMALITY_MISSING_DOCS时,返回的对象必须包含formality和invalidDocuments,否则也会触发类型错误。
内容的提问来源于stack exchange,提问作者Bilal
相关产品推荐
相关产品推荐

