类表达式的显式类型

时间:2018-08-05 11:29:42

标签: typescript types

如果我具有以下类型和功能

interface Mapper {
  mapper: (number) => number
}

function withNumberAdded(num: number) {
  return class implements Mapper {
    mapper = (n: number) => num + n
  }
}

withNumberAdded返回的确切类型是什么? Atom告诉我它的typeof Anonymous class,但是如果我这样做了

const IMPL = withNumberAdded(88)
console.log(new IMPL().mapper(33))

编译。但是,如果我故意输入错字并写上new IMPL().mappr(33),则编译会失败并显示

  

类型“(匿名类)”上不存在属性“ mappr”。你是否   是“映射器”的意思?

因此,对于这种类型,打字稿似乎比(Anonymous class)了解的更多:)

如果我想明确指定类型,该怎么做?

function withNumberAdded(num: number): Mapper

不起作用(因为我猜这是实例类型)。 那么我应该在最后:之后放什么?

1 个答案:

答案 0 :(得分:1)

您返回的类与接口不匹配,它仅与该类的 instance 匹配。

在JavaScript中,“类”具有两个方面,即静态方面(构造函数和静态方法/变量)和实例方面(非静态方法/变量)。

您可以为双方创建接口,在您的示例中,静态方接口仅具有构造函数,因为您没有任何静态变量或方法:

interface MapperConstructor {
   new(): Mapper;
}

现在您可以使用此构造函数接口作为返回值:

function withNumberAdded(num: number): MapperConstructor { 
    // .. 
}

另请参阅:TypeScript documentation about interfaces(class types)