Flowtype 从联盟中挑选一个

Flowtype 从联盟中挑选一个,flowtype,Flowtype,我正在尝试使用这里的类型ImageURISource: 类型ImageURISource={ uri?:字符串, 捆绑?:字符串, 方法?:字符串, 标题?:对象, 主体?:字符串, 缓存?:“默认”|“重新加载”|“强制缓存”|“仅当缓存时”, 宽度?:数字, 高度:数字, 比例?:数字, }; 导出类型ImageSource=ImageURISource |编号|数组; 然而,我们看到它是作为一个联合体与另外两个东西一起导出的。有可能从一个工会中选出一个吗 我希望能做到: $Pick<

我正在尝试使用这里的类型
ImageURISource

类型ImageURISource={
uri?:字符串,
捆绑?:字符串,
方法?:字符串,
标题?:对象,
主体?:字符串,
缓存?:“默认”|“重新加载”|“强制缓存”|“仅当缓存时”,
宽度?:数字,
高度:数字,
比例?:数字,
};
导出类型ImageSource=ImageURISource |编号|数组;
然而,我们看到它是作为一个联合体与另外两个东西一起导出的。有可能从一个工会中选出一个吗

我希望能做到:

$Pick<ImageSource, ImageURISource>
$Pick

它不是很漂亮,但是您可以使用精化来具体精化您想要的类型,方法如下:

var source: ImageSource = {}
if (typeof source === "number" || Array.isArray(source)) throw new Error();
var uriSource = source;
type ImageURISource = typeof uriSource;
这里的缺点是,如果用户向联合添加更多类型,代码将再次失败


看来你最好还是做一个公关,让自己做出反应来揭露那种类型。

是的,这种改进很糟糕。我尽量不在js端做任何事情来优化类型。只是注释。我试试看,谢谢!或者仅仅在流注释中进行这些改进是可能的?我认为没有任何方法可以获得联合的一部分,因为这可能会暴露出比您所希望的更多的关于实现的私有细节。你永远不知道它是否有别名或者其他什么。
var source: ImageSource = {}
if (typeof source === "number" || Array.isArray(source)) throw new Error();
var uriSource = source;
type ImageURISource = typeof uriSource;