Javascript静态类型检测器Flow原始类型(Primitive Types)介绍

299 1 年前
Flow支持原始数据类型:boolean,number,string,null,void,其中的void类型,它就是Javascrip中的undefined类型,Flow用起来是的确是简单,但里面的内容很多,主要原因是是要看实际不同的使用情况作搭配。

Javascript的原始值的类型

Javascript有许多不同的原始类型:

  • Boolean
  • String
  • Number
  • null
  • undefined ( 在Flow类型中为void)
  • Symbol (ES6, Flow暂不支持)

原始类型在语言中既可作为字面量值出现。

true;
"hello";
3.14;
null;
undefined;

也可作为包装对象出现。

new Boolean(false);
new String("world");
new Number(42);
Symbol("foo");

字面量值的类型都是小写的

// @flow
function method(x: number, y: string, z: boolean) {
  // ...
}

method(3.14, "hello", true);

包装对象的类型是大写的(像他们的构造函数一样,首字母大写)

// @flow
function method(x: Number, y: String, z: Boolean) {
  // ...
}

method(new Number(42), new String("world"), new Boolean(false));

包装对象类型很少被使用。

Booleans

JavascriptBooleanstruefalseFlow里的boolean类型也接受这两个值

// @flow
function acceptsBoolean(value: boolean) {
  // ...
}

acceptsBoolean(true);  // Works!
acceptsBoolean(false); // Works!
acceptsBoolean("foo"); // Error!

Javascript会隐式的把其他类型的值转换为 boolean

if (42) {} // 42 => true
if ("") {} // "" => false

Flow理解这些转换,并且允许这些转换作为 if 语句或其他表达式的一部分。

Boolean类型需要明确地转换non-booleans,你可以使用 Boolean(x) 或者 !!x

// @flow
function acceptsBoolean(value: boolean) {
  // ...
}

acceptsBoolean(0);          // Error!
acceptsBoolean(Boolean(0)); // Works!
acceptsBoolean(!!0);        // Works!

记住:booleanBoolean 是不同的。

  • boolean 是程序中的一个字面量 truefalse或者是一个比较表达式的结果值,例如:a === b
  • Boolean是一个包装对象new Boolean(x)

new Boolean(x)Boolean(x)也是不同的哟,前者返回一个基本包装对象,后者返回类型转换字面量结果。

Numbers

与许多其他语言不同,Javascript中数值只有一种类型,这些值像 42 或者3.14表现出来,在Javascript也认为NaNInfinity是数值类型,number类型捕获所有Javascript认为的数值。

// @flow
function acceptsNumber(value: number) {
  // ...
}

acceptsNumber(42);       // Works!
acceptsNumber(3.14);     // Works!
acceptsNumber(NaN);      // Works!
acceptsNumber(Infinity); // Works!
acceptsNumber("foo");    // Error!

注意:numberNumber是不同的类型

  • number 是指一个字面量的值,例如:423.14 或者是一个表达式返回的数值parseFloat(x)
  • Number是一个基本包装类型,new Number(x)

当然,new Number(x)Number(x)也是不同的,前者返回包装对象,后则是一个数值转换,返回一个字面号值。

Strings

Javascriptstring是像"foo",在Flowstring类型也也接受这些值。

// @flow
function acceptsString(value: string) {
  // ...
}

acceptsString("foo"); // Works!
acceptsString(false); // Error!

JavaScript 通过连接其它类型的值将其隐式转换为 string 类型

"foo" + 42; // "foo42"
"foo" + {}; // "foo[object Object]"

当拼接成字符串时,Flow仅仅接受 stringnumber

// @flow
"foo" + "foo"; // Works!
"foo" + 42;    // Works!
"foo" + {};    // Error!
"foo" + [];    // Error!

你必须明确地将其它类型转换为字符串。要转换,你可以使用String()方法或使用其他转换为字符串的方法。

// @flow
"foo" + String({});     // Works!
"foo" + [].toString();  // Works!
"" + JSON.stringify({}) // Works!

记住stringString是不同的类型。

  • string 是指一个字面量的值,例如:'"foo"''"Hello world"' 或者是一个表达式返回的数值"" + 42
  • String是一个基本包装类型,new String(x)

String()new String()也是不同的,前者返回转换后的字符串字面量,后者返回的是一个字符串包装对象。

null and void

javascriptnullundefined两个值,Flow把他们作为单独的类型:nullvoid(代表undefined)。

// @flow
function acceptsNull(value: null) {
  /* ... */
}

function acceptsUndefined(value: void) {
  /* ... */
}

acceptsNull(null);      // Works!
acceptsNull(undefined); // Error!
acceptsUndefined(null);      // Error!
acceptsUndefined(undefined); // Works!

nullvoid 也会出再在其他类型。

可能的类型

(Maybe types)

可能类型代表这个位置的值是可选的,你可以在类型前添加一个问号?来创建可选类型,例如:?string 或者 ?number

除了?type中的type这个类型值外,可能类型也可以是 null 或者 void

// @flow
function acceptsMaybeString(value: ?string) {
  // ...
}

acceptsMaybeString("bar");     // Works!
acceptsMaybeString(undefined); // Works!
acceptsMaybeString(null);      // Works!
acceptsMaybeString();          // Works!

上面例子中如果调用函数不带参数其实质是参数为undefined

可选的对象类型属性

(Optional object properties)

对象类型可以有可选的属性,在那里,该属性名后面有一个问号?

{ propertyName?: string }

除了设置的type外,可选属性既可以是void也可以省略整个属性。但是,这个属性不能为null

// @flow
function acceptsObject(value: { foo?: string }) {
  // ...
}

acceptsObject({ foo: "bar" });     // Works!
acceptsObject({ foo: undefined }); // Works!
acceptsObject({ foo: null });      // Error!
acceptsObject({});                 // Works!

可选的函数参数

(Optional function parameters)

函数可以有可选的参数,在那里,该参数名后面有一个问号?

function method(param?: string) { /* ... */ }

除了设置的类型外,可选参数既可以是void也可以直接省略这个参数。但是,这个参数不能是null

// @flow
function acceptsOptionalString(value?: string) {
  // ...
}

acceptsOptionalString("bar");     // Works!
acceptsOptionalString(undefined); // Works!
acceptsOptionalString(null);      // Error!
acceptsOptionalString();          // Works!

其实省略不传这个参数就是这个参数为undefined(在Flow里为void)。

带默认值的函数参数

(Function parameters with defaults)

函数参数可以有默认值,这是ECMAScript 2015的特性。

function method(value: string = "default") { /* ... */ }

除了设置的类型外,带默认值参数既可是是void也可以省略这个参数。但是,这个参数不为null

// @flow
function acceptsOptionalString(value: string = "foo") {
  // ...
}

acceptsOptionalString("bar");     // Works!
acceptsOptionalString(undefined); // Works!
acceptsOptionalString(null);      // Error!
acceptsOptionalString();          // Works!

省略不传这个参数就是这个参数为undefined(在Flow里为void)。

Symbol

Symbols暂时不被Flow所被支持。

更多请访问 原始类型

分类栏目
© 2018邮箱:11407215#qq.comGitHub沪ICP备12039518号-6