gpt4 book ai didi

typescript - 嵌套 map 类型给出了令人困惑的类型提示

转载 作者:搜寻专家 更新时间:2023-10-30 21:33:21 28 4
gpt4 key购买 nike

我写了一个嵌套的 Omit以两种不同的方式输入,但对我来说更有意义的一种会给出复杂的类型提示,而不太直观的一种实际上看起来最好。开始了:

type HasSameNested = {
a: {
c: number; d: string
},
b: {
c: string; d: number
}
}; // flipped C and D types

type Omit2<T, K1 extends keyof T, K2 extends keyof T[K1]> = {
[P1 in keyof T]: P1 extends K1 ? {
[P2 in Exclude<keyof T[K1], K2>]: T[P1][P2]
} : T[P1]
}

type Omit2_2<T, K1 extends keyof T, K2 extends keyof T[K1]> = {
[P1 in keyof T]: P1 extends K1 ? {
[P2 in Exclude<keyof T[P1], K2>]: T[P1][P2]
} : T[P1]
}

type omit_union = Omit2<HasSameNested, 'a' | 'b', 'c'>;
let T6: omit_union;
T6.a; // works, type is { d: string }
T6.b; // works, type is { d: number }

type omit_union_2 = Omit2_2<HasSameNested, 'a' | 'b', 'c'>;
let T7: omit_union_2;
T7.a.d = 'a'; // works but types are ugly:
// a: { [P2 in Exclude<keyof HasSameNested[K1 & "a"], "c">]: HasSameNested[K1 & "a"][P2]; }
// d: d: HasSameNested[K1 & "a"]["d"]

T7.b.d = 4; // works but types are ugly, as above

将错误的类型分配给 T7.b.dT7.a.d确实告诉我,例如string is not assignable to number ,但是我不明白为什么要使用 Exclude<keyof T[P1], K2>即使 P1 in keyof T 也会给出如此复杂的打字和 P1 extends K1 , 和 Exclude<keyof T[K1], K2>给出正确的类型。

最佳答案

在我看来,这看起来像是编译器中的错误。我刚刚提交了 Microsoft/TypeScript#31326并将从那里报告更新的信息。祝你好运!

更新,2019-05-10:这已被其中一位语言设计者标记为错误。不确定何时修复它,但至少我们知道您对此类信息感到困惑是对的。

更新,2019-05-11:如您所见,此错误现在是 fixed并已合并到 master 中。这意味着如果您现在使用 typescript@next 尝试您的代码,您应该会看到新的行为:

type omit_union_2 = Omit2_2<HasSameNested, 'a' | 'b', 'c'>;
declare let T7: omit_union_2;
T7.a; // works, type is { d: string }
T7.b; // works, type is { d: number }

我看不出您的 T6T7 类型之间有什么区别。所以,看起来这完全是由那个编译器错误引起的,并且应该在 2019 年 5 月 30 日左右发布 TypeScript 3.5 时消失。

好的,祝你好运!

关于 typescript - 嵌套 map 类型给出了令人困惑的类型提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56050214/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com