Skip to main content

Primitive Types

JavaScript有三种非常常用的原始类型:stringnumberboolean,每个类型在TypeScript中都有相应的类型。

这三种类型在JavaScript和TypeScript中有相同的名字,可以使用typoef操作符判断其类型。

除此之外,还有nullundefined原始类型,void则代表一个函数没有返回值。

boolean

boolean代表一个值要么是true,要么是false,非真既假。

const isTrue: boolean = true;
const isFalse: boolean = false;
const toBoolean: boolean = Boolean('123');

number

number类型表示一个数字,包含整数和浮点数。

const floatValue: number = 3.14;
const infinityValue: number = -Infinity;
const INT_MAX_VAlUE: number = Number.MAX_SAFE_INTEGER;
const OUT_MAX_VALUE: number = Number.MAX_VALUE;

const toNumber: number = Number('123');
const parseIntNumber: number = parseInt('456');
const parseFloatNumber: number = parseFloat('789');
const operatorNumber: number = +'10';

string

string是TypeScript中表示文本数据的原始数据类型。它是16位Unicode字符集的一组元素。

const nameText: string = 'John Doe';
const ageText: String = new String('16');

undefined / null

JavaScript有两种类型的原始值用于表示值不存在或未初始化: nullundefined

  1. null即空指针,代表引用类型的空值。
  2. undefined即未定义类型,代表原始值的空值。
// 推断x为any
let x = undefined;
x = 1

考虑如上代码,x为什么会被推断为any类型?

undefined是JavaScript系统中默认的空值占位符,如果类型推断为undefined,会使后续赋值造成类型不匹配,null也是如此。

如果确实要定义undefined类型,可使用以下方式:

let y = void 0;

// Type '1' is not assignable to type 'undefined'.
y = 1

因此不能将初始化为undefined的值进行显式类型定义为undefinednull也是如此。

strictNullChecks

TypeScript也有两种类型相应的同名类型,这些类型的行为取决于strictNullChecks选项如何设置。

strictNullChecks关闭时,值为nullundefined仍然可以正常访问,并且nullundefined可以被任何类型的属性。缺乏这些值的检测往往会导致一些Bug,因此TypeScript总是推荐开启strictNullChecks

strictNullChecks开启时,当一个值是nullundefined,这些值被用之前需要去检测方法或属性是否存在。就像在使用一个可选的属性之前,先要检测是否其值是否是undefiend,可以使用类型窄化去检测值是否可能是null

function doSomething(x: string | null) {
if (x === null) {
// do something
} else {
// do something else
}
}

doSomething(null);

void

void类型代表不返回值的函数返回值。如果一个函数没有任何的返回语句或没有返回一个明确的值,返回类型会被认为是void

// 返回类型默认是 vod
function noop1() {}
function noop2() {
return
}

JavaScript中,一个函数如果没有返回任何的值,将隐式地返回undefined。而在TypeScript中,voidundefined是不同的东西。

对于函数来说,void返回类型可以产生一些不寻常但是被期望的行为。一个函数返回类型为void不会强制函数不返回某些内容。另一种说法是,具有void返回类型的上下文函数类型,在实现时可以返回其它任何的值,但是会被忽略。

type voidFunc = () => void;

const f1: voidFunc = () => {
return 1 + 1;
};

const v1 = f1();
console.log(v1);

当一个字面量函数声明返回类型为void,那么这个函数禁止返回任何值。

function f2(): void {
// Type 'boolean' is not assignable to type 'void'.
return false;
}

bigint

BigInt是JavaScript新增的一种类型,可以表示更大的整数范围,支持基本的数学运算。由于BigInt是ES2020版本带来的特性,因此可能存在平台兼容性的问题,使用前要确保其是否支持。

使用时可使用后缀n将数字标记为BigInt类型,大多数情况下,编译器可以自动推断变量的类型为BigInt,因此一般不需要显式指定类型。

let an = 10n;
let bn = 20n;
// 自动推断为bigint
let sum = an + bn;
console.log(sum);

BigInt类型不能与Number类型直接混合使用,因为它们是不同的类型。BigInt也不能使用一些常见的操作,例如位运算、Math对象的方法:

// Argument of type 'bigint' is not assignable to parameter of type 'number'.
console.log(Math.sqrt(an));

// Operator '>>>' cannot be applied to types 'bigint' and 'number'.
console.log(an >>> 1);

在进行大小比较时,会将Number类型先转为BigInt类型再进行比较。

Symbol

Symbol是ES6新增的一种原始值,其值不可变,并且是独一无二的,可通过Symbol构造函数创建:

let sym1 = Symbol();
let sym2 = Symbol("key"); // optional string key
let sym3 = Symbol("key");

console.log(sym2 === sym3); // false

Symbol可以被作为对象的属性来使用:

const sym = Symbol();
const obj = {
[sym]: "value"
}
console.log(obj[sym]); // value

interface UserInfoOptions {
a: Symbol;
}

const obj1: UserInfoOptions = {
a: Symbol('a')
}

Symbol也可以与计算属性声明结合使用,来声明对象属性和类成员:

const key = Symbol('key');
const method = Symbol('method');

class MyClass {
[key] = 'value';
[method]() {
console.log('method');
}
}

const cc = new MyClass();
console.log(cc[key]); // value
cc[method](); // method

unique symbol

为了将symbol字面量看做唯一的,可以使用unique symbolunique symbolsymbol的子类型,只能通过调用Symbol()Symbol.for()或者显式类型注解得到。这种类型只被允许使用const声明以及readonly static属性。为了引用一个明确的unique symbol,必须使用typeof操作符。

declare const sym1: unique symbol;

// A variable whose type is a 'unique symbol' type must be 'const'.
let sym2: unique symbol = Symbol();

let sym3: typeof sym1 = sym1

class C {
static readonly StaticSymbol: unique symbol = Symbol();
}

因为每个唯一符号都具有完全独立的身份标识,所以没有两种唯一符号类型是可互相分配或可比较的: