flow中文文档(九)

相交类型

有时候,创建一个类型(它是一组其他类型的集合)是很有用的。例如,您可能希望编写一个接受对象的函数,该对象是其他对象类型的组合。为此,Flow支持交集类型。

// @flow
type A = { a: number };
type B = { b: boolean };
type C = { c: string };

function method(value: A & B & C) {
  // ...
}

// $ExpectError
method({ a: 1 }); // Error!
// $ExpectError
method({ a: 1, b: true }); // Error!
method({ a: 1, b: true, c: 'three' }); // Works!

相交类型语法

交集类型是任意数量的类型,这些类型是由&号联接的。

Type1 & Type2 & ... & TypeN

交集类型的每个成员可以是任何类型,甚至是另一个交集类型。

type Foo = Type1 & Type2;
type Bar = Type3 & Type4;

type Baz = Foo & Bar;

交集类型需要全部输入,但只需要一个输出。

交集类型与并集类型相反。当调用接受交集类型的函数时,我们必须传入所有这些类型。但是在我们的函数内部,我们只需要把它当作这些类型中的任何一种。

// @flow
type A = { a: number };
type B = { b: boolean };
type C = { c: string };

function method(value: A & B & C) {
  var a: A = value;
  var b: B = value;
  var c: C = value;
}

即使我们只将值视为其中的一种类型,我们也不会得到一个错误,因为它满足了所有类型。

不可能相交类型

使用相交类型,可以创建在运行时无法创建的类型。交集类型允许您组合任何类型集,即使是那些相互冲突的类型。

例如,可以创建数字和字符串的相交类型。

// @flow
type NumberAndString = number & string;

function method(value: NumberAndString) {
  // ...
}

// $ExpectError
method(3.14); // Error!
// $ExpectError
method('hi'); // Error!

但是您不可能同时创建一个数字和一个字符串的值,但是您可以为它创建一个类型。创建这样的类型没有实际的用途,但是它是交集类型工作方式的副作用。

对象相交类型

创建对象相交类型时,可以将它们的所有属性合并在一起。

例如,当您创建具有不同属性集的两个对象的交集时,它将导致具有所有属性的对象。

// @flow
type One = { foo: number };
type Two = { bar: boolean };

type Both = One & Two;

var value: Both = {
  foo: 1,
  bar: true
};

但是,当您的属性通过具有相同的名称而重叠时,它也会创建属性类型的交集。

例如,如果将两个对象与名为prop的属性合并,其中一个对象的类型为Number,另一个对象的类型为布尔,则得到的对象将具有数字和布尔值的交集。

// @flow
type One = { prop: number };
type Two = { prop: boolean };

type Both = One & Two;

// $ExpectError
var value: Both = {
  prop: 1 // Error!
};

获取类型的类型

JavaScript有一个TypeOF操作符,它返回一个描述值的字符串。

typeof 1 === 'number'
typeof true === 'boolean'
typeof 'three' === 'string'

但是,由于这个字符串只描述了关于类型的太多内容,所以它是有限的。

typeof { foo: true } === 'object'
typeof { bar: true } === 'object'
typeof [true, false] === 'object'

在Flow中,有一个类似类型的操作符,但它的功能要强大得多。ss

获取类型语法

TypeOf运算符返回给定值的流类型,以用作类型。

// @flow
let num1 = 42;
let num2: typeof num1 = 3.14;     // Works!
// $ExpectError
let num3: typeof num1 = 'world';  // Error!

let bool1 = true;
let bool2: typeof bool1 = false;  // Works!
// $ExpectError
let bool3: typeof bool1 = 42;     // Error!

let str1 = 'hello';
let str2: typeof str1 = 'world'; // Works!
// $ExpectError
let str3: typeof str1 = false;   // Error!

您可以在Typeof中使用任何值:

// @flow
let obj1 = { foo: 1, bar: true, baz: 'three' };
let obj2: typeof obj1 = { foo: 42, bar: false, baz: 'hello' };

let arr1 = [1, 2, 3];
let arr2: typeof arr1 = [3, 2, 1];

类型继承-推理行为

Flow对您的代码执行各种类型推断,因此您不必键入任何注释。一般情况下,推理会避免妨碍您的方法,同时也会阻止您引入bug。

但是,当您使用Typeof时,您是在获取Flow的推断结果,并将其断言为一个类型。虽然这可能非常有用,但也可能导致一些意想不到的结果。

例如,当您在流中使用文本值时,它们推断的类型就是它所属的基元。因此,数字42具有推断出的数字类型。使用Typeof时可以看到这一点。

// @flow
let num1 = 42;
let num2: typeof num1 = 3.14;    // Works!

let bool1 = true;
let bool2: typeof bool1 = false; // Works!

let str1 = 'hello';
let str2: typeof str1 = 'world'; // Works!

但是,这只发生在推断的类型中。如果指定文字类型,则将在Typeof中使用它。

// @flow
let num1: 42 = 42;
// $ExpectError
let num2: typeof num1 = 3.14;    // Error!

let bool1: true = true;
// $ExpectError
let bool2: typeof bool1 = false; // Error!

let str1: 'hello' = 'hello';
// $ExpectError
let str2: typeof str1 = 'world'; // Error!

类型继承其他类型的行为

flow中有许多不同的类型,其中一些类型的行为与其他类型不同。这些差异对该特定类型是有意义的,但对其他类型则没有意义。

当您使用Typeof时,您插入的是另一个类型及其所有行为。这可以使类型看起来不一致的地方,它不是。

例如,如果在类中使用Typeof,则需要记住类名义上是类型化的,而不是结构类型化的。因此,两个具有相同确切形状的类不被认为是等价的。

// @flow
class MyClass {
  method(val: number) { /* ... */ }
}

class YourClass {
  method(val: number) { /* ... */ }
}

// $ExpectError
let test1: typeof MyClass = YourClass; // Error!
let test2: typeof MyClass = MyClass;   // Works!
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,649评论 18 139
  • 学习如何在Flow中使用React 将Flow类型添加到React组件后,Flow将静态地确保你按照组件被设计的方...
    vincent_z阅读 6,343评论 4 21
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,094评论 1 32
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,362评论 8 265
  • 是因为一个
    8870阅读 271评论 0 0