-
Notifications
You must be signed in to change notification settings - Fork 990
/
Copy pathmetapgrogramming.spec.ts
118 lines (106 loc) · 2.33 KB
/
metapgrogramming.spec.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import { expect } from "chai";
import {
SameType,
RecursiveKeyOf,
LeafElems,
DeepPick,
DeepOmit,
RequireKeys,
DeepExtract,
} from "./metaprogramming";
describe("metaprogramming", () => {
it("can calcluate recursive keys", () => {
// BUG BUG BUG: String literals seem to extend each other? I can break the
// test and it still passes.
const test: SameType<
RecursiveKeyOf<{
a: number;
b: {
c: boolean;
d: {
e: number;
};
f: Array<{ g: number }>;
};
}>,
"a" | "a.b" | "a.b.c" | "a.b.d" | "a.b.d.e" | "a.b.f.g"
> = true;
expect(test).to.be.true;
});
it("can detect recursive elems", () => {
const test: SameType<LeafElems<[[["a"], "b"], ["c"]]>, "a" | "b" | "c"> = true;
expect(test).to.be.true;
});
it("Can deep pick", () => {
interface original {
a: number;
b: {
c?: boolean;
d: {
e: number;
};
g: boolean;
};
c?: {
d: number;
};
h?: number;
}
interface expected {
a: number;
b: {
c?: boolean;
};
c?: {
d: number;
};
h?: number;
}
const test: SameType<DeepPick<original, "a" | "b.c" | "c" | "h">, expected> = true;
expect(test).to.be.true;
});
it("can deep omit", () => {
interface original {
a: number;
b: {
c: boolean;
d: {
e?: number;
};
g: boolean;
};
h?: number;
g: number;
}
interface expected {
b: {
d: {
e?: number;
};
g: boolean;
};
h?: number;
g: number;
}
const test: SameType<DeepOmit<original, "a" | "b.c">, expected> = true;
expect(test).to.be.true;
});
it("can require keys", () => {
interface original {
a?: number;
b?: number;
}
interface expected {
a: number;
b?: number;
}
const test: SameType<RequireKeys<original, "a">, expected> = true;
expect(test).to.be.true;
});
it("Can DeepExtract", () => {
type test = "a" | "b.c" | "b.d.e" | "b.d.f" | "b.g";
type extract = "a" | "b.c" | "b.d";
type expected = "a" | "b.c" | "b.d.e" | "b.d.f";
const test: SameType<DeepExtract<test, extract>, expected> = true;
});
});