# 十四.装包和拆包
前言
# 1.装包
type Proxy<T> = {
get(): T;
set(value: T): void;
};
type Proxify<T> = {
[P in keyof T]: Person<T[P]>;
};
let props = {
name: "abc",
age: 111,
};
function proxify<T>(obj: T): Proxify<T> {
let result = {} as Proxify<T>;
for (let key in obj) {
let value = obj[key];
result[key] = {
get() {
return value;
},
set: (newValue) => (value = newValue),
};
}
return result;
}
let proxpProps = proxify(props);
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 2.拆包
对于 Readonly,Partial 和 Pick 的映射类型, 我们可以对映射之后的类型进行拆包。 还原映射之前的类型, 这种操作我们称之为拆包。
interface TestInterface {
name: string;
age: number;
}
// 增加只读和可选属性
type TestType<T> = {
+readonly [P in keyof T]+?: T[P];
}
type test = TestType<TestInterface>;
//type test = {
// readonly name?: string;
// readonly age?: number;
//}
// 删除只读和可选属性
type UnMyType<T> = {
-readonly [P in keyof T]-?: T[P];
}
type test2 = UnMyType<test>;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function unProxify<T>(proxpProps: Proxify<T>): T {
let result = {} as T;
for (let key in proxpProps) {
let value = proxpProps[key];
result[key] = value.get();
}
return result;
}
let proxy = unProxify(proxpProps);
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
← 十三.映射类型 十五.自定义集合操作 →