接口

接口是 TypeScript 中比较重要的概念之一。TypeScript 中的接口不仅能够像 Java 和 C# 中的接口一样定义类模板,还提供了定义数据结构规约的功能。接口可以像一个类型一样使用,其中定义的内容均为适配该接口的对象或者类需要包含的属性及方法。以下用一个示例来说明接口中支持的所有功能及定义方法。

interface Sample<T> {
  name: string; // 定义一个必备属性
  value?: number; // 定义一个可选属性
  readonly x: number; // 定义一个只读属性
  [propName: string]: any; // 定义使用[]索引访问元素或属性的方法
  [index: number]: string; // 定义使用数字索引访问元素的方法,类似于数组
  new (arg: T); // 定义实现类需要实现的构造方法
}

// 这里定义了一个接口,其所接受的泛型类型限定必须为MessageType的子类,但是如果在使用这个接口的时候,没有声明所使用的泛型类型,那么将直接使用默认的MessageType.Message类型作为其泛型类型参数。
interface Sample<T extends MessageType = MessageType.Message>;

// 使用接口定义一个支持泛型的函数类型
interface SampleFunction {
  <T>(arg: T): boolean;
}
// 这种格式也是可以的,只是泛型类型T会对所有成员可见
interface SampleFunction<T> {
  (arg: T): boolean;
}

定义类的时候,可以使用 implements 关键字使类成为接口的一个实现。接口之间可以使用 extends 进行继承和扩展,同时接口还可以继承和扩展类。任何包含接口中所定义的成员的对象,都将被视为接口的实例,并在进行类型判断的时获得真值,这遵循“鸭子类型”的类型规则。

接口中的成员都是 public 的,不需要任何访问修饰符。但是在类定义中,可以使用 privateprotected 访问修饰符来定义私有以及保护成员。

工具接口

Typescript中还提供了一大批的工具接口,这些工具接口利用泛型对目标类型进行了修改,使其功能和特性发生了一定的变化,从而简化了接口的定义。常用的工具接口主要有以下这些。

  • Partial<Type>,将目标类型中的所有属性都变为可选的。
  • Required<Type>,将目标类型中的所有属性都变为必需的。
  • Readonly<Type>,将目标类型中的所有属性都变成只读的。
  • Record<Keys, Type>,定义一个键值对类型,键只能是Keys类型,相当于其他语言中的Map类型。
  • Pick<Type, Keys>,定义一个从Type中派生的新类型,这个新类型只能具有Keys中指定名称的属性。Keys通常使用字符串字面量联合类型定义。
  • Omit<Type, Keys>,定义一个从Type中派生的新类型,这个新类型将不具备Keys中指定名称的属性,Keys通常使用字符串字面量联合类型定义。
  • Exclude<UnionType, ExcludeMembers>,定义一个从UnionType中派生出来的新类型,这个新类型中将不包含ExcludeMembers中指定的成员类型。新类型是可以被赋值给原类型的。
  • Extract<Type, Union>,定义一个从Union中匹配Type提取出来的新类型。新类型是可以被赋值给原类型的。
  • NonNullable<Type>,将原本可空的类型改为不可空的类型,即移除其中的null | undefined
  • Parameters<Type>,构建函数类型Type所使用的参数类型,参数类型使用元组或者数组表示。
  • ConstructorParameters<Type>,从指定类型Type的构造函数中提取其参数构建新的类型,构造函数参数类型也同样使用远足或者数组表示。
  • ReturnType<Type>,构建函数类型Type所使用的返回值类型。
  • InstanceType<Type>,构建给定类型Type的构造函数构建出来的实例类型。
  • ThisParameterType<Type>,获取函数类型Typethis参数的类型。
  • OmitThisParameter<Type>,从给定的函数类型Type中移除this绑定。可以用来重新为Type类型更换this绑定。
  • ThisType<Type>,用于标记this上下文类型,并不会返回新的类型。
  • Uppercase<StringType>,用于生成字符串或者字符串联合类型StringType对应的全大写形式的类型。
  • Lowercase<StringType>,用于生成字符串或者字符串联合类型StringType对应的全小写形式的类型。
  • Capitalize<StringType>,用于生成字符串或者字符串联合类型StringType对应的首字母大写形式的类型。
  • Uncapitailize<StringType>,用于生成字符串或者字符串联合类型StringType对应的首字母小写形式的类型。