You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript报Type 'boolean' is not assignable to type 'U[T]'错误如何解决

错误信息

Type 'boolean is not assignable to type 'U[T]'

错误原因

泛型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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 18:39:03