Omit的实现

  • 先放上实现的代码,这个网上有很多
	type MyOmit<T, K extends keyof T> = {
		[P in keyof T as P extends K ? never : P]: T[P]
	}
  • 如何使用?

	type Person = {
		name: string;
		age: number;
	}

	type onlyAgePerson = MyOmit<Person, 'name'>;

	// 等同于定义了
	type onlyAgePerson = {
		age: number;
	}
  • Omit类型有2个type parameters:

    • 第一个传入的是参照类型,第二个是忽略或丢弃的参照类型的属性(property)
  • 这个实现涉及到了几个关键字 extends,keyof,in,as,以及三元表达式 => (逻辑表达式 ? type A: type B)。

  • extends 这里的含义是分配,type A extends type B, 就是type A 分配给 type B。

    • 如果可以被分配,就是逻辑true,能被分配的逻辑就是 type A的property 一定要包含可以分配的 property
    • 如果不能被分配,就是逻辑false
  • as,因为有extends的逻辑在,且 P in keyof T 是一个读取T的枚举属性的过程,并不返回确定的值,最后被ts推断为any类型。

    • 也就是说如果不写: as P,那么三元表达式就会被推断为 P in keyof T extends K ? any : any;
    • 那么你写的表达式是 P in keyof T extends K ? never : P, never是不能被any赋值的,这里产生了约束,( type never = type any是禁止的, type any = type never是可以的。)
    • 由此会报循环约束(circyle constraints的错误),个人推断。
    • 至于如何个循环或者(闭环约束),我猜测本来想用never去约束不存在的类型,但是上一个逻辑又用任意类型any去约束never, 必然是无解的。
  • 简单写下博客,前因后果也没写太明白,后续慢慢改。