有人可以解释为什么更具体的输入是坏的吗?

时间:2017-05-28 20:19:50

标签: javascript reactjs types flowtype

Flow's documentation states

给出一个课程:

class BaseClass {
  method(value: City): City { ... }
}

一个子类:

class SubClass extends BaseClass {
  method(value: SanFrancisco): City { ... } // ERROR!!
}
     

这是Flow中的一个错误,因为如果你期待一个SanFrancisco而你得到一个城市,你可能会使用只存在于SanFrancisco上的东西,这会在运行时引起错误。

如果我正在调用SubClass#method,我是否会被类型检查程序强制提供SanFrancisco?为什么流程会导致错误?

1 个答案:

答案 0 :(得分:1)

假设SeattleSanFrancisco都直接延伸City,即

class City { location: [number, number]; }
class Seattle extends City { raining: bool; }
class SanFrancisco extends City { foggy: bool; }

BaseClass.prototype.method接受CitySeattleSanFrancisco的实例,并可能使用locationSubClass.prototype.method可以免费使用foggy即使Seattle缺少财产。这意味着SubClass.prototype.method通常无法替代BaseClass.prototype.method

请参阅https://en.wikipedia.org/wiki/Subtyping#Function_types