Flow 中星号 (*) 类型的用途是啥,TypeScript 中的等价物是啥?

Posted

技术标签:

【中文标题】Flow 中星号 (*) 类型的用途是啥,TypeScript 中的等价物是啥?【英文标题】:What is the use of asterisk (*) type in Flow and what is the equivalent of that in TypeScript?Flow 中星号 (*) 类型的用途是什么,TypeScript 中的等价物是什么? 【发布时间】:2017-10-21 17:12:52 【问题描述】:

首先,我最熟悉 TypeScript。 Flow 在很多方面看起来与 TS 非常相似,但我最近偶然发现了一个星号 (*) 类型。起初,我认为它是“any”的同义词,但现在,在阅读了 Flow 的一些发行说明后,我发现它不是。我浏览了所有官方文档,并没有找到“*”的任何用法。

那么,它是什么以及何时使用它?但是,什么是 TypeScript 中的直接等价物?

【问题讨论】:

你能展示一些示例代码来演示它的用法吗?它听起来是Literal Type,这意味着该特定变量的值只能是*。在 Typescript 中,您可以创建字符串文字类型。 typescriptlang.org/docs/handbook/advanced-types.html 在 Kefir.js 库的流定义中可以看到大量示例:github.com/rpominov/kefir/blob/master/kefir.js.flow。例如,检查 never() 方法。它具有签名 Observable。我真的没有得到这个,因为 never() 没有返回任何东西,所以我假设它会有一个 Observable 的签名。另一方面,它可能意味着它有副作用,所以 void 也不好。 另外,来自官方 Flow 变更日志:“我们现在将丢失的类型参数视为任何类型。例如,以前 ReactElement 被视为 ReactElement。现在它被视为 ReactElement”。在阅读这篇文章之前,我假设 any 和 * 是相同的...... 【参考方案1】:

编辑:由于我最初写了这个答案,我了解到* 在模块边界出现时是不安全的。我不推荐使用它,将来可能会被删除。

它只是告诉 Flow 推断一个类型参数,而不是让你显式地写出来:

function foo(): Array<*> 
  return [5];


// Flow issues an error:
//    2:   return [5];
//                 ^ number. This type is incompatible with
//    10: (foo(): Array<string>);
//                     ^ string
(foo(): Array<string>);

(try flow)

它与any 不同——any 是一个不安全的类型,因此如果在此示例中将* 替换为any,Flow 不会给您任何错误。你可以用number 替换它,Flow 会给你一个类似的错误。

【讨论】:

非常感谢您的回答!我现在很清楚 Flow 中的用例。但是你能帮我解决我问题的第二部分吗? TS 的类似语法是什么? 不幸的是我不能,因为我不熟悉 Typescript。如果您每个问题只问一个问题,该网站效果最佳,那么第二部分可能是单独问题的良好候选者? 是的,听起来不错,所以我会遵循它。谢谢!【参考方案2】:

Flow 中的星号* 告诉它推断类型,Nat Mote 已经回答了这个问题

此外,Typescript 没有星号的直接等效项,因此无法告诉它推断类型。但是,它确实像 Flow 一样,在某些特定情况下会自动推断类型。 TypeScript Type Inference Documentation, Type Inference Examples

在此页面上查看unique features: Differences between Flow and TypeScript

【讨论】:

以上是关于Flow 中星号 (*) 类型的用途是啥,TypeScript 中的等价物是啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用 pip 安装 python 包时星号 * 的用途是啥

`reveal_type` 输出中的星号是啥意思?

“类型”是啥意思,ECMA 6 中的问号有啥特殊用途吗?

python中的*和**的用途

轮胎中Type: MRN ,UTN , ULN 分别是啥意思?指的是啥型号或用途?

C语言当中结构句后面一个星号,是啥意思?