扩展推断的“ this”

时间:2018-08-17 17:42:47

标签: typescript

假设我有一个基本的原型:

const proto = {
  const1: 1,
  const2: 2
}

现在在某个地方我写了另一个应该可以访问此基本原型的对象。第一次尝试失败。

const consumer = {
  method1(): number {
    return this.const1 //const1 does no exist
  },
  method2() {
    return this.method1()
  }
}

第二次尝试

//consumer is downcast to 'any' since it references itself
const consumer = {
  method1(this: typeof consumer & typeof proto): number {
    return this.const1
  },
  method2() {
    return this.method1()
  }
}

是否有任何技巧或方法告诉this参数接收到当前对象以及继承的原型? (最好不要重构类)

1 个答案:

答案 0 :(得分:1)

您不能使用简单的变量来执行此操作,您将需要一个额外的函数来帮助进行推断,并且需要使用特殊的ThisType<T>来告诉编译器this应该做什么适用于对象文字内定义的任何类型:

const proto = {
    const1: 1,
    const2: 2
}


function extend<TBase, TCurrent>(base: TBase, current: TCurrent & ThisType<TCurrent & TBase>): TCurrent & TBase {
    return Object.assign(current, base);
}
const consumer = extend(proto, {
    method1(): number {
        return this.const1 //works
    },
    method2() {
        return this.method1()
    }
});