【问题标题】:Type 'boolean' is not assignable to type 'U[T]'类型 'boolean' 不可分配给类型 'U[T]'
【发布时间】:2021-11-16 17:08:04
【问题描述】:

我不明白为什么 typescript 给我这个错误:

这是相关代码:

  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;
        })
      );
  }

Playground example

【问题讨论】:

  • 请提供可重现的例子
  • 我添加了一个游乐场示例链接
  • 这样不行。关于U,请看这个答案stackoverflow.com/questions/69187022/…。有用吗?
  • 另一方面,对象的突变可能会导致您出现另一种类型的错误。请参阅我关于 TS 中的突变的文章catchts.com/mutations
  • 见这个例子 tsplay.dev/mx51GW 。 U 可能是Record&lt;T, boolean&gt; 的任何允许子类型

标签: typescript


【解决方案1】:

这样的事情怎么样...请注意,我重构了 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;
        })
      );
  }

【讨论】:

    猜你喜欢
    • 2017-06-29
    • 1970-01-01
    • 2019-01-04
    • 2023-01-22
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    相关资源
    最近更新 更多