typescript 泛型类-TypeScript 子类

类库提供了参数类型的能力。 在其他语言中最基本的用途就是定义容器类型,这样实用函数就不需要知道所操作的变量的具体类型。 JavaScript 中的字段或 Promise 将被描述为 TypeScript 中的类库类型。 例如,Promise.all的类型定义可以写成:

function all(values: Array<T | Promise>): Promise<Array>

可以看出,类型参数可以用来构造更复杂的类型、执行集合操作或嵌套。

默认情况下,由于类型参数可以是任何类型,因此您不能假设它具有单独的属性或方法,并且无法访问其任何属性。 你只能通过添加约束来遵守这个约束来使用它,TypeScript 也会遵循这个约束。 限制传入的类型:

interface Lengthwise {
  length: number
}
function logLength(arg: T) {
  console.log(arg.length)
}

其他类型参数或多个类型参数也可以在约束中使用。 在下面的代码中,我们将类型参数 K 限制为 obj 的属性名称:

function getProperty(obj: T, key: K) {
  return obj[key];
}

除了在函数上使用库之外,我们还可以定义库类型:

type Partial = {
  [P in keyof T]?: T[P];
}

当定义类库类型时,我们实际上是在定义一个处理该类型的“函数”,使用类库参数来生成新类型。 这也称为“元编程”。 例如,Partial 将遍历传入类型 T 的每个属性并返回一个新类型,其中所有属性均可为空:

interface Person {
  name: string
}
const a: Person = {} // 报错 Property 'name' is missing in type '{}' but required in type 'Person'.
const b: Partial = {}

后面我们要讲的Pick和Extract都是这样的库类型。

此外,TypeScript 甚至可以在定义类库类型时进行条件判断和递归,这使得 TypeScript 的类型系统图灵完备,可以在编译阶段进行任意估计。

你可能想知道这样复杂的类型真的有用吗? 虽然这个功能更多的是针对库开发者typescript 泛型,但是对于 ORM、JavaScript 社区中的数据结构,或者像 lodash 这样的库来说,这样一个强大的类型系统是非常有必要的。 lodash的类型定义行数甚至是其自身代码的数十倍。

如果你想轻松调试ts的特性typescript 泛型类,可以在这里练习TypeScript

在线调试。