我有这个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 生成项目中重现问题而创建的最小状态。你知道如何解决这个问题吗?