TypeScript类型中bivarianceHack的目的是什么?

时间:2018-10-05 14:33:42

标签: typescript types

在阅读React的TypeScript类型时,我看到了这种模式的一些用法,其中涉及#simple feed forward def feedforward(self): self.layer1 = sigmoid(np.dot(self.input, self.weights1) + self.bias1) self.layer2 = sigmoid(np.dot(self.layer1, self.weights2) + self.bias2) self.layer3 = sigmoid(np.dot(self.layer2, self.weights3) + self.bias3) self.output = sigmoid(np.dot(self.layer3, self.weights4) + self.bias4) 函数声明:

@types/react/index.d.ts

bivarianceHack()

尽管我发现other instances正在使用该特定模式,但搜索并没有带我找到任何关于为什么使用此特定模式的文档,因此它似乎不是React特定的模式。

为什么使用此模式而不是type EventHandler<E extends SyntheticEvent<any>> = { bivarianceHack(event: E): void }["bivarianceHack"];

1 个答案:

答案 0 :(得分:11)

这与strictfunctionTypes选项下的功能兼容性有关。在此选项下,如果参数为派生类型,则不能将其传递给将传递基类参数的函数。例如:

class Animal { private x:undefined }
class Dog extends Animal { private d: undefined }

type EventHandler<E extends Animal> = (event: E) => void

let o: EventHandler<Animal> = (o: Dog) => { } // fails under strictFunctionTyes

然而,PR

中提到了严格函数类型的警告
  

更严格的检查适用于所有函数类型,除方法或构造函数声明中的那些函数以外。专门排除了方法,以确保通用类和接口(例如Array)继续保持大多数协变关系。严格检查方法的影响将是一个重大突破,因为大量泛型类型将变为不变(即使如此,我们可能会继续探索这种更严格的模式)。

已添加重点

因此,hack的作用是即使在EventHandler下也允许strictFunctionTypes的双变量行为。由于事件处理程序的签名将在方法声明中包含其源代码,因此将无需进行更严格的功能检查。

type BivariantEventHandler<E extends Animal> = { bivarianceHack(event: E): void }["bivarianceHack"];
let o2: BivariantEventHandler<Animal> = (o: Dog) => { } // still ok  under strictFunctionTyes 

Playground link