Primitive Types
JavaScript有三种非常常用的原始类型:string、number、boolean,每个类型在TypeScript中都有相应的类型。
这三种类型在JavaScript和TypeScript中有相同的名字,可以使用typoef操作符判断其类型。
除此之外,还有null、undefined原始类型,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有两种类型的原始值用于表示值不存在或未初始化: null和undefined。
null即空指针,代表引用类型的空值。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的值进行显式类型定义为undefined,null也是如此。
strictNullChecks
TypeScript也有两种类型相应的同名类型,这些类型的行为取决于strictNullChecks选项如何设置。
当strictNullChecks关闭时,值为null或undefined仍然可以正常访问,并且null和undefined可以被任何类型的属性。缺乏这些值的检测往往会导致一些Bug,因此TypeScript总是推荐开启strictNullChecks。
当strictNullChecks开启时,当一个值是null或undefined,这些值被用之前需要去检测方法或属性是否存在。就像在使用一个可选的属性之前,先要检测是否其值是否是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中,void和undefined是不同的东西。
对于函数来说,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 symbol。unique symbol是symbol的子类型,只能通过调用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();
}
因为每个唯一符号都具有完全独立的身份标识,所以没有两种唯一符号类型是可互相分配或可比较的: