如何定义装饰器的类型以防止丢失装饰函数的类型信息?

时间:2016-12-08 20:25:59

标签: javascript flowtype

鉴于以下内容:

ngIf
当您使用数字呼叫时,

flow会抛出错误,但是当您使用数字

呼叫b时则不会
// @flow

function a(s: string): ?string {
  return s === '' ? null : s
}

function decorate(f: Function): Function {
  return f
}

const b = decorate(a)

a(12)
b(12)

有没有这样的方法,你可以做像

这样的事情
13: a(12)
      ^^ number. This type is incompatible with the expected param type of
 3: function a(s: string): ?string {
                  ^^^^^^ string

这样装饰函数可以正确地检查,而不会明确地限制装饰返回的内容,如

function decorate(f: Function): typeof(f) {
  return f
}

或复制b上的类型信息,如

function decorate(f: Function): (string) => ?string {}

2 个答案:

答案 0 :(得分:2)

你需要为此创建函数polymorphic

function decorate<T: Function>(f: T): T {
  return f
}

答案 1 :(得分:1)

您可以参数化您的功能:

function decorate(f: Function): Function {
  return f;
}

可以

function decorate<T>(f: T): T {
  return f;
}

说“结果的类型与输入的类型相同。