TypeScript报Type 'boolean' is not assignable to type 'U[T]'错误如何解决
错误信息
![Type 'boolean is not assignable to type 'U[T]'](https://i.sstatic.net/jXpFO.png)
错误原因
泛型U extends Record<T, boolean>的约束仅代表U是键为T类型、值为boolean子类型的结构,不代表U的值类型就是通用的boolean。调用方可以传入更窄的字面量类型作为U的定义,比如{ testFeature: true },此时你给对应键赋值false就不符合U的类型要求,因此TS抛出类型不匹配错误。
该场景下泛型U属于多余定义:函数返回的结构完全由传入的featureKeys决定,值始终为boolean类型,不需要调用方额外指定U类型。
修复方案
删除不必要的U泛型,直接将返回类型声明为Observable<Record<T, boolean>>即可解决报错,修改后的代码如下:
// 前置类型定义(根据你的实际业务调整即可) interface MembershipFeatures { // 替换为你实际的feature键定义 } interface Membership { features: MembershipFeatures; } type Observable<T> = any; declare const combineLatest: any; declare const map: any; declare const of: any; // 修复后的函数 getFeaturesFromMembership$<T extends keyof MembershipFeatures>( membership$: Observable<Membership>, featureKeys: T[], isPreview$: Observable<boolean> = of(false) ): Observable<Record<T, boolean>> { return combineLatest([membership$, isPreview$]) .pipe( map(([membership, isPreview]) => { const features = {} as Record<T, boolean>; for (const key of featureKeys) { features[key] = false; } if (!membership || isPreview) { Object.keys(features).forEach(key => features[key as T] = true); return features; } Object.keys(features).forEach(key => { features[key as T] = key in membership.features ? membership.features[key as keyof MembershipFeatures] : true; }); return features; }) ); }
如果出于特殊需求必须保留U泛型,可以通过类型断言绕开校验:features[key] = false as U[T],但该写法会跳过TS的类型检查,非必要不推荐使用。
内容的提问来源于stack exchange,提问作者Bart van den Burg
相关产品推荐
相关产品推荐

