首页 > 解决方案 > 类型“布尔”不能分配给类型“U[T]”

问题描述

我不知道为什么打字稿给我这个错误:

类型“布尔”不可分配给类型“U[T]”

这是相关代码:

  getFeaturesFromMembership$<T extends keyof MembershipFeatures,
    U extends Record<T, boolean>>(membership$: Observable<Membership>,
                                  featureKeys: T[],
                                  isPreview$: Observable<boolean> = of(false)
  ): Observable<U> {
    return combineLatest([membership$, isPreview$])
      .pipe(
        map(([membership, isPreview]) => {
          const features: U = {} as U;

          for (const key of featureKeys) {
            features[key] = false; // <- error here
          }

          if (!membership || isPreview) {
            Object.keys(features).forEach(key => features[key] = true);
            return features;
          }

          Object.keys(features).forEach(key => features[key] = key in membership.features ? membership.features[key] : true);

          return features;
        })
      );
  }

游乐场示例

标签: typescript

解决方案


像这样的东西怎么样......请注意,我重构了 for 循环。

// I did create this types for simulating your types
type Membership = { features : string[] }
type Observable<T> = any
function of<T>(someValue : T) : Observable<T>{}
interface MembershipFeatures { key1: string; key2: string; }


// My solution
type FoundRecord<T extends keyof MembershipFeatures> = { [key in T] : boolean}

// Function...
function getFeaturesFromMembership$<SelectedKey extends keyof MembershipFeatures>(
    membership$: Observable<Membership>,
    featureKeys: SelectedKey[],
    isPreview$: Observable<boolean> = of(false)
  ): Observable<FoundRecord<SelectedKey>> {
    return combineLatest([membership$, isPreview$])
      .pipe(
        map(([membership, isPreview]) => {
            const features: FoundRecord<SelectedKey> = {} as FoundRecord<SelectedKey>;
            for (const key of featureKeys) {
                if (!membership || isPreview) {
                    features[key] = true;
                } else {
                    features[key] = false;
                    features[key] = key in membership.features ? membership.features[key] : true
                }
            }

            return features;
        })
      );
  }

推荐阅读