函数类型签名:() => void 不是箭头函数而是类型
interface 进行函数声明:
interface FuncFooStruct {
  (name: string): number
}推荐仅不返回时使用
rest 参数也可以使用元组
逻辑较复杂的情况下,函数可能有多组入参类型和返回值类型
如:
function func(foo: number, bar?: boolean): string | number {
  if (bar) {
    return String(foo)
  } else {
    return foo * 599
  }
}这里的类型签名完全没有体现这一点,我们只知道它的返回值是这么个联合类型
应该使用函数重载签名
function func(foo: number, bar: true): string
function func(foo: number, bar?: false): number
function func(foo: number, bar?: boolean): string | number {
  if (bar) {
    return String(foo)
  } else {
    return foo * 599
  }
}TypeScript 中的重载更像是伪重载,它只有一个具体实现,其重载体现在方法调用的签名上而非具体实现上
异步为 Promise<T>,迭代器不重要
在构造函数中对参数应用访问性修饰符,参数会被直接作为类的成员(即实例的属性),免去后续的手动赋值:
class Foo {
  constructor(public arg1: string, private arg2: boolean) {}
}
new Foo('linbudu', true)TypeScript 4.3 新增了 override 关键字,来确保派生类尝试覆盖的方法一定在基类中存在定义
一个抽象类描述了一个类中应当有哪些成员(属性、方法等),一个抽象方法描述了这一方法在实际实现中的结构:
abstract class AbsFoo {
  abstract absProp: string
  abstract get absGetter(): string
  abstract absMethod(name: string): string
}无法声明静态的抽象成员。
interface 不仅可以声明函数结构,也可以声明类的结构:
interface AbsFoo {
  absProp: string
  get absGetter(): string
  absMethod(input: string): string
}
class Foo implements AbsFoo {
  absProp: string = 'linbudu'
  get absGetter() {
    return 'linbudu'
  }
  absMethod(name: string) {
    return name
  }
}