如何修复 Type '{ [key in K]:unknown; } & S["data"]' 不可分配给 TypeScript 中的类型 'ScopeFormDataType'

2024-03-22

我有这个TypeScript 游乐场 https://www.typescriptlang.org/play?#code/KYDwDg9gTgLgBMAdgVwLZwMoGMJmHAbwCg44AxadAXjgCIAzS2gGhLgDlgBneG2xbjBZEAvkSKhIsODACeeTDjwBpYLIAyASx4AVecAA8bdQhAwkAEy6LcwVqR2nziKzbx68B9QD5W3uDQ6ANoA5GAAhlBIMCEAuk6W1ti2HoaaiPTAUHAAggkuSUrA3mwA-HAA1moQ9HDBIRbhMOFxcABkbsCqGtowqQY5zHWhEVGIMbElpABcldW19Y3NceKS0PByCsl4nDwAIk3hqQGEbOkWoLMoqABGWQDcbAI8s8SkpIwQszxQ6QDmj3ecBukVmNwgEAANsBwohAXARI9EatwOsZPpOhQoKgDs1jjQ3nAABbASGQr5wH7-eEAd2gkIsVzQdygSMeElR0k2+G2wB04Ru0Pxpw+lFmvKxOMOqXhzxg4qKuxguKO+jZKKkGwxvP6bDyoGcrl59jgACF8q5kIgKogIDTECcrTa7YgiP4CWwluEFSkBUL9EEcrF4ZDNFVZjl4aNoqVZuaDYlOv10plso4EwVOkMU1k4ABFKbvcqmtgzOACABuWVE7LWXO1RQAauFIcg+fojKQTBmjUUTemzImdR2fCblBbCrZulpdCOhjpfG6TotDq0e9YCHAglVZHB0nBlLFZk7bfaEWVhg1V7Egoe2LN6tHxmvB5nh54c9l9a-e7ZC+VeWbVt208Ut3kGMCHBGSJojiE0gV5aden6QZLyfCZC1IQsrmAKsoA1NFuTgAAFGDxnfQwMHdNgAB9MFouAAAoMAnJMO0-OAAA1swyXMAE1MKLOA+NYiiDA41CONNQSgXKUixhgMSBMg94cLwlS1KyABKAjpHoK0sBgTQIAdLhgBgYioFsWBZCAtsAHlEF5Ts4G7H9JzwE0WPXNjPFHNhxx8xC1BnPo50wEpvEYrginFIYwCsvAbNmZQhgrFs2x9PA7JAwx1CGDAhmUbwtNmCsIE0CwRT3WpGIS6y5D3UyigAOi9LTqtIGLbDaw4gnqpK5HiGh0uA+ERAQSEzJqpjurwFr0I6wkuvMyyGtsjLgEc3lota9D4sSrI5DSzatPGybpuWmQiSsmly2AO6AFEoCsqBGIAAzWwbd1teALnodJgCqkzKSKd6zrYMQxA5TU4H0xBDOMh0-lWw6bJysgrNQZzjFEvs2G89zfLyxdSECongp6Wc-IKxcorm4A4rgCIYCJFLSs6HL+nyzAiv8OirX+wGqsJaF4C4CBkCgLBGZIsjFKKfoqLgAWXGAAGBCqmgGfEUgaSJTRoVmyXpeAJawM0WqWaJJrKRNmXeuac2gVIG4onCCowIm0lLpUiWpZlk5-dNhb5a9yHdZmxiAEJg5l533iiGApddUhodIJOU7tgPgEd8J+qaIlYlEIA:

export enum Scope {
  Form = "form",
  Nest = "nest",
}

export type ScopeKeyListType<
  L extends Scope,
  T extends ScopeType<L>,
> = T['parent'] extends ScopeType<infer A extends Scope>
  ? keyof T['data'] & ScopeKeyListType<A, T['parent']>
  : keyof T['data']

export type ScopeNestDataType = {
  index: number;
  nest: {
    foo: string;
    bar: boolean;
  };
};

export type ScopeFormDataType = {
  hello: string;
  world: number;
};

export type ScopeTableType = {
  form: ScopeFormDataType;
  nest: ScopeNestDataType;
};

export type ScopeType<
  A extends Scope,
  B extends unknown = unknown
> = {
  data: ScopeTableType[A];
  like: A;
  parent?: B extends ScopeType<infer T extends Scope, infer Q>
    ? B
    : never
};

export type ScopeValueType<
  L extends Scope,
  T extends ScopeType<L>,
  K extends ScopeKeyListType<L, T>,
> = T['data'] extends { [key in K]: unknown }
  ? T['data'][K]
  : T['parent'] extends ScopeType<infer A extends Scope>
  ? ScopeValueType<
      A,
      T['parent'],
      ScopeKeyListType<A, T['parent']>
    >
  : never

export type ParentScopeType<S> =
  | S
  | (S extends ScopeType<infer X, infer Y>
      ? Y extends ScopeType<infer A, infer B>
        ? ParentScopeType<Y>
        : never
      : never)

export function setPropertyValueOnScope<
  L extends Scope,
  S extends ScopeType<L>,
  K extends ScopeKeyListType<L, S>
>(scope: S, property: K, value: ScopeValueType<L, S, K>): void {
  if (property in scope.data) {
    scope.data[property] = value;
  } else if (scope.parent) {
    setPropertyValueOnScope(scope.parent, property, value);
  } else {
    throw new Error(`Property not defined on scope`);
  }
}

export function getPropertyValueFromScope<
  L extends Scope,
  S extends ScopeType<L>,
  K extends ScopeKeyListType<L, S>,
>(scope: S, path: K): ScopeValueType<L, S, K> | undefined {
  let source: ParentScopeType<S> | undefined = scope

  while (source) {
    if (path in source.data) {
      break
    } else {
      source = source.parent
    }
  }

  if (!source) {
    return
  }

  return source.data[path]
}

我收到 2 个错误,每个函数各有一个:


Type 'ScopeValueType<L, S, K>' is not assignable to type 'ScopeTableType[L][K]'.
  Type 'S["data"][K] | (S["parent"] extends ScopeType<infer A extends Scope, unknown> ? ScopeValueType<A, S["parent"], ScopeKeyListType<A, S["parent"]>> : never)' is not assignable to type 'ScopeTableType[L][K]'.
    Type 'S["data"][K]' is not assignable to type 'ScopeTableType[L][K]'.
      Type '{ [key in K]: unknown; } & S["data"]' is not assignable to type 'ScopeTableType[L]'.
        Type '{ [key in K]: unknown; } & S["data"]' is not assignable to type 'ScopeFormDataType & ScopeNestDataType'.
          Type '{ [key in K]: unknown; } & S["data"]' is not assignable to type 'ScopeFormDataType'.(2322)

Type 'ScopeTableType[L][K]' is not assignable to type 'ScopeValueType<L, S, K> | undefined'.
  Type 'ScopeTableType[L][ScopeKeyListType<L, S>]' is not assignable to type 'ScopeValueType<L, S, K> | undefined'.
    Type 'ScopeTableType[L][keyof S["data"]] | ScopeTableType[L][keyof S["data"] & ScopeKeyListType<Scope, S["parent"]>]' is not assignable to type 'ScopeValueType<L, S, K> | undefined'.
      Type 'ScopeTableType[L][keyof S["data"]]' is not assignable to type 'ScopeValueType<L, S, K> | undefined'.
        Type 'ScopeTableType[L][string] | ScopeTableType[L][number] | ScopeTableType[L][symbol]' is not assignable to type 'ScopeValueType<L, S, K> | undefined'.
          Type 'ScopeTableType[L][string]' is not assignable to type 'ScopeValueType<L, S, K> | undefined'.(2322)

我已经被这两个错误困扰了几天,在一件事工作和另一件事之间来回切换。这是我为在复杂的编译器 AST 生成项目中重现问题而创建的最小状态。你知道如何解决这个问题吗?


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何修复 Type '{ [key in K]:unknown; } & S["data"]' 不可分配给 TypeScript 中的类型 'ScopeFormDataType' 的相关文章

随机推荐