# 十四.装包和拆包

前言

# 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.拆包

对于 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
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