【发布时间】:2017-09-23 15:20:08
【问题描述】:
在下面的代码示例中,意图是scrapeMovies 函数只接受可序列化的对象。
/* @flow */
type SerializableObjectType = {
[key: string]: string | number | boolean | $ReadOnlyArray<SerializableObjectType> | SerializableObjectType
};
type GuideType = {|
rid: string
|};
const guide: GuideType = {
rid: 'foo'
};
const scrapeMovies = async (guide: SerializableObjectType) => {};
scrapeMovies(guide);
我不明白flowtype 抱怨scrapeMovies 被喂给guide 对象的原因是什么,这是SerializableObjectType 的不太严格的定义。
在这里定义子类型的正确方法是什么?
【问题讨论】:
-
你的类型看起来很矛盾。
ScrapeMoviesGuideType仅具有一个属性,而SerializableObjectType是通用字典。如果您为scrapeMovies声明guide: SerializableObjectType,这意味着您可能会传递错误的类型,因为它只接受ScrapeMoviesGuideType。 -
目的是为所有刮板方法定义一种通用类型。特定的刮板方法应该能够将类型限制在通用类型的范围内。正如您所说,
SerializableObjectType是通用字典,但ScrapeMoviesGuideType是该字典的子类型。 -
const scrapeMovies: ScrapeMoviesType告诉 Flow 该函数接受SerializableObjectType作为参数。所有其他类型信息已被删除。这意味着您可以将任何可序列化的对象传递给函数,这与实际的函数定义直接矛盾。 “特定的刮板方法应该能够将类型限制在通用类型的范围内。”但如何?如果它只知道它是可序列化的,那就是它所知道的一切。您实际上是在告诉它从超类型 转换为 子类型,这是不允许的。 -
这是设计上不允许的,还是可能需要的功能?
-
你会做和this simple double-declaration一样的事情。你有一个接受通用类型的函数,另一个接受特定类型的函数。传递给
scrapeMoviesInner的arg不匹配。
标签: flowtype javascript flowtype