Skip to content

构造签名

JavaScript函数也可以用 new 操作符来调用。TypeScript将这些称为构造函数,因为它们通常会创建一个新的对象。你可以通过在调用签名前面添加 new 关键字来写一个构造签名。

typescript
class Ctor { 
  s: string 
  constructor(s: string) { 
    this.s = s 
  } 
}

type SomeConstructor = { 
  new (s: string): Ctor 
}
function fn(ctor: SomeConstructor) { 
  return new ctor("hello") 
}

const f = fn(Ctor) 
console.log(f.s)

有些对象,如 JavaScript 的 Date 对象,可以在有 new 或没有 new 的情况下被调用。你可以在同一类型中任意地结合调用和构造签名。

typescript
interface CallOrConstruct { 
  new (s: string): Date; 
  (n?: number): number; 
}

function fn(date: CallOrConstruct) { 
  let d = new date('2021-11-20') 
  let n = date(100) 
}

再举一个例子:

typescript
interface ClockConstructor { 
  new (hour: number, minute: number): ClockInterface; 
}

interface ClockInterface { 
  tick(): void; 
}

function createClock( 
  ctor: ClockConstructor, 
  hour: number, 
  minute: number 
 ): ClockInterface { 
    return new ctor(hour, minute); 
 }

class DigitalClock implements ClockInterface { 
  constructor(h: number, m: number) {} 
  tick() { 
    console.log("beep beep"); 
  } 
}

class AnalogClock implements ClockInterface { 
  constructor(h: number, m: number) {} 
  tick() { 
    console.log("tick tock"); 
  } 
}

let digital = createClock(DigitalClock, 12, 17); 
let analog = createClock(AnalogClock, 7, 32);