javascript - 流类型, `+`和 `-`在泛型声明中做什么?

标签 javascript flowtype

类似于:

declare class $ReadOnlyArray<+T>
declare type React$Element<+ElementType: React$ElementType>
interface $Iterator<+Yield,+Return,-Next>

不是出现在properties前面的那种,这里回答Flow type, What does the `+` symbol mean in front a property?

最佳答案

这是我的理解,可能不完整。

通用类型中的协变,例如 type Container<+T> = {} , 表示:如果 AB 的子类型, 然后 Container<A>Container<B> 的子类型.例如,这是允许的:

type Container<+T> = {};
class Parent {};
class Child extends Parent {};
function x(a: Container<Parent>) {}
const container: Container<Child> = {};
x(container);

因为ChildParent 的子类型.但是如果你删除 + ,不再允许,Flow 在 x(container) 上给出错误,因为 container不是 Container<Parent> 类型的有效值.

当然逆变是相反的:type Container<-T> = {}意味着如果 AB 的子类型, 然后 Container<B>Container<A> 的子类型.所以这是合法的:

type Container<-T> = {};
class Parent {};
class Child extends Parent {};
function x(a: Container<Child>) {}
const container: Container<Parent> = {};
x(container);

请注意我对 Container<+T> 的定义或 Container<-T>没有使用 T 类型根本。如果是这样,那么它的使用位置就会受到限制,类似于你可以在接口(interface)中使用逆变或协变属性(即它们变成只读或只写)的限制。我还没有弄清楚这些规则的细节。

关于javascript - 流类型, `+`和 `-`在泛型声明中做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51277329/

相关文章:

javascript - CSS3 + Javascript - 将 -ms-transition :opacity 1s ease-in-out; work in IE 10 alone?

Javascript:如何检查末尾没有 `fail` block 的 promise 链?

javascript - 覆盖流对象类型中的单个字段类型的通用方法

javascript - window.onunload 在 IE 9/10/11 中不起作用?

javascript - 从 reducer 访问 Redux 存储值,无需控制操作创建者

javascript - 嵌套 promise : make two promise calls back to back, 传递值

javascript - 无法在 CLI 上运行 babel 命令

javascript - meteor.js 铁路由器 : prevent static template re-render and glitching?

scala - 如何声明必须返回其参数之一的函数的签名? (任何语言*)

javascript - 如何定义流日志输出文件