Skip to content

Commit 51445d8

Browse files
committed
feat: add 9160-hard-assign
1 parent 9321756 commit 51445d8

File tree

2 files changed

+115
-0
lines changed

2 files changed

+115
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// 参考 https://github.com/type-challenges/type-challenges/issues/10566
2+
type Assign<
3+
T extends Record<string, unknown>,
4+
U extends unknown[]
5+
> = U extends [infer F, ...infer Rest]
6+
? F extends Record<string, unknown>
7+
? Assign<
8+
{
9+
[K in keyof T | keyof F]: K extends keyof F
10+
? F[K]
11+
: K extends keyof T
12+
? T[K]
13+
: never;
14+
},
15+
Rest
16+
>
17+
: Assign<T, Rest>
18+
: T;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
import type { Equal, Expect } from "@type-challenges/utils";
2+
3+
// case1
4+
type Case1Target = {};
5+
6+
type Case1Origin1 = {
7+
a: "a";
8+
};
9+
10+
type Case1Origin2 = {
11+
b: "b";
12+
};
13+
14+
type Case1Origin3 = {
15+
c: "c";
16+
};
17+
18+
type Case1Answer = {
19+
a: "a";
20+
b: "b";
21+
c: "c";
22+
};
23+
24+
// case2
25+
type Case2Target = {
26+
a: [1, 2, 3];
27+
};
28+
29+
type Case2Origin1 = {
30+
a: {
31+
a1: "a1";
32+
};
33+
};
34+
35+
type Case2Origin2 = {
36+
b: [2, 3, 3];
37+
};
38+
39+
type Case2Answer = {
40+
a: {
41+
a1: "a1";
42+
};
43+
b: [2, 3, 3];
44+
};
45+
46+
// case3
47+
48+
type Case3Target = {
49+
a: 1;
50+
b: ["b"];
51+
};
52+
53+
type Case3Origin1 = {
54+
a: 2;
55+
b: {
56+
b: "b";
57+
};
58+
c: "c1";
59+
};
60+
61+
type Case3Origin2 = {
62+
a: 3;
63+
c: "c2";
64+
d: true;
65+
};
66+
67+
type Case3Answer = {
68+
a: 3;
69+
b: {
70+
b: "b";
71+
};
72+
c: "c2";
73+
d: true;
74+
};
75+
76+
// case 4
77+
type Case4Target = {
78+
a: 1;
79+
b: ["b"];
80+
};
81+
82+
type Case4Answer = {
83+
a: 1;
84+
b: ["b"];
85+
};
86+
87+
type cases = [
88+
Expect<
89+
Equal<
90+
Assign<Case1Target, [Case1Origin1, Case1Origin2, Case1Origin3]>,
91+
Case1Answer
92+
>
93+
>,
94+
Expect<Equal<Assign<Case2Target, [Case2Origin1, Case2Origin2]>, Case2Answer>>,
95+
Expect<Equal<Assign<Case3Target, [Case3Origin1, Case3Origin2]>, Case3Answer>>,
96+
Expect<Equal<Assign<Case4Target, ["", 0]>, Case4Answer>>
97+
];

0 commit comments

Comments
 (0)