TypeScript入门到精通——TypeScript类型系统基础——原始类型
TypeScript类型系统基础——原始类型
JavaScript 语言中的每种原始类型都有与之对应的 TypeScript 类型。除此之外,TypeScript 还对原始类型进行了细化与扩展,增加了枚举类型和字面量类型等。
到目前为止,TypeScript 中的原始类型包含以下几种:
- boolean
- string
- bigint
- number
- symbol
- undefined
- unll
- void
- 枚举类型
- 字面量类型
1、boolean
TypeScript 中的 boolean 类型对应于 JavaScript 中的 Boolean 原始类型。该类型能够表示两个逻辑值: true 和 false。
示例如下:
const yes; boolean = true; const no; boolean = false;
2、string
TypeScript 中的 string 类型对应于 JavaScript 中的 String 原始类型。该类型能够表示采用 Unicode UTF-16 编码格式存储的字符序列。
string 类型使用 string 关键字表示。我们通常使用字符串字面量或模版字面量来创建 string 类型的值。
示例如下:
const foo: string = 'foo'; const bar: string = `bar, ${foo}`;
3、number
原始类型 number 是用于表示所有数字的类型,包括整数和浮点数。
let age: number = 25; let pi: number = 3.1415926;
在上面的例子中,我们声明了两个变量age和pi,它们的类型都是number。age是一个整数,pi是一个浮点数。
TypeScript的number类型与JavaScript的number类型是一样的,可以表示任何数字,包括整数和浮点数。在TypeScript中,所有的数字都是浮点数,即使它们看起来像是整数。例如,当你将一个整数赋值给一个number类型的变量时,TypeScript会自动将它转换为浮点数。
4、bigint
原始类型 bigint 是在JavaScript中引入的一种新的数据类型,用于表示任意大的整数。在TypeScript中,也可以使用 bigint 类型来表示大整数。
let bigInt: bigint = 123456789012345678901234567890n; let num: number = 123; // 错误:Type 'bigint' is not assignable to type 'number'. let sum: number = bigInt + num; // 正确:将bigInt转换为number类型 let sum: number = Number(bigInt) + num;
5、symbol 与 unique symbol
Symbol是JavaScript中引入的一种新的原始数据类型,它的每个值都是唯一的,并且是不可变的。在TypeScript中,Symbol类型对应于JavaScript中的Symbol原始类型,可以用来创建唯一的标识符。
Symbol类型的值是通过调用Symbol函数来创建的。Symbol函数可以接受一个可选的描述字符串作为参数,用于标识Symbol值的用途。
let sym1: Symbol = Symbol(); let sym2: Symbol = Symbol("my symbol");
在上面的例子中,我们创建了两个Symbol类型的值sym1和sym2。sym1没有描述字符串,而sym2有一个描述字符串"my symbol"。
Symbol类型的值主要用于创建对象的唯一属性名,以避免属性名的冲突。由于每个Symbol值都是唯一的,因此可以用它们来作为对象的属性名,这样就可以保证不会与其他属性名重复。
let obj = {}; let sym: Symbol = Symbol("my property"); obj[sym] = "Hello, world!"; console.log(obj[sym]); // 输出 "Hello, world!"
在上面的例子中,我们创建了一个空对象obj和一个Symbol类型的值sym。然后,我们使用sym作为属性名,将字符串"Hello, world!"赋值给obj对象的该属性。由于sym是唯一的,因此可以确保该属性名不会与其他属性名冲突。最后,我们通过obj[sym]访问该属性的值,并输出"Hello, world!"。
除了作为对象的属性名之外,Symbol类型的值还可以用于其他目的,例如作为枚举的值或作为函数的名称。由于每个Symbol值都是唯一的,因此可以用它们来创建唯一的标识符,以确保不会与其他标识符冲突。
在TypeScript中,unique symbol是一种特殊的symbol类型,它代表一个唯一的、不可变的值,用于在对象属性中创建唯一的标识符,以避免属性名冲突。unique symbol是TypeScript 4.4版本中引入的新特性。
unique symbol的起源可以追溯到JavaScript中的Symbol类型。Symbol是JavaScript中引入的一种新的原始数据类型,它的每个值都是唯一的,并且是不可变的。在TypeScript中,Symbol类型对应于JavaScript中的Symbol原始类型,可以用来创建唯一的标识符。然而,在TypeScript中,普通的Symbol值可以被多次声明和使用,这可能会导致属性名冲突。为了解决这个问题,TypeScript引入了unique symbol类型。
unique symbol的主要功能是创建一个唯一的标识符,用于在对象属性中避免名称冲突。unique symbol是通过调用unique symbol函数来创建的,该函数接受一个描述字符串作为参数,用于标识unique symbol值的用途。
下面是一个使用unique symbol的例子:
class MyClass {
private readonly _myUniqueSymbol: unique symbol = Symbol.for("myUniqueSymbol");
public getMyUniqueSymbol(): symbol {
return this._myUniqueSymbol;
}
}
const obj1 = new MyClass();
const obj2 = new MyClass();
console.log(obj1.getMyUniqueSymbol() === obj2.getMyUniqueSymbol()); // 输出 false
在上面的例子中,我们创建了一个名为MyClass的类,该类有一个私有属性_myUniqueSymbol,其类型为unique symbol。我们使用Symbol.for方法创建了一个唯一的symbol值,并将其赋值给_myUniqueSymbol属性。然后,我们定义了一个公共方法getMyUniqueSymbol,用于返回_myUniqueSymbol属性的值。
接下来,我们创建了两个MyClass类的实例obj1和obj2,并分别调用它们的getMyUniqueSymbol方法,获取它们的_myUniqueSymbol属性的值。由于unique symbol值是唯一的,因此obj1和obj2的_myUniqueSymbol属性的值是不同的,所以输出为false。
通过使用unique symbol,我们可以在对象属性中创建唯一的标识符,以避免属性名冲突。这在某些情况下非常有用,例如在创建对象的私有属性时,可以使用unique symbol作为属性名,以确保不会与其他对象的属性名冲突。
6、Nullable
TypeScript 中的 Nullable 类型指的是值可以为 undefined 或 null 的类型。
JavaScript 中有两个比较特殊的原始类型,即 Undefined 类型和 Null 类型。两者分别仅包含一个原始值,即 undefined 值和 null 值,它们通常用来表示某个值还未进行初始化。
7、void
void 类型表示某个值不存在,该类型用作函数的返回值类型。若一个函数没有返回值,那么该函数的返回值类型为 void 类型。除了将 void 类型作为函数返回值类型外,在其他地方使用 void 类型是无意义的。
下面是一个使用void类型的例子:
function logMessage(message: string): void {
console.log(message);
}
logMessage("Hello, world!");
在上面的例子中,我们定义了一个名为logMessage的函数,该函数接受一个字符串参数message,并且没有返回值。该函数的返回值类型为void。我们调用该函数并传入一个字符串参数"Hello, world!"。由于该函数没有返回值,因此它的返回类型为void。
需要注意的是,如果一个函数声明了返回类型为void,但实际上返回了一个值,那么TypeScript会抛出一个类型错误。例如:
function logMessage(message: string): void {
console.log(message);
return "This is a mistake!"; // TypeScript会抛出类型错误
}
在上面的例子中,我们在logMessage函数中返回了一个字符串值"This is a mistake!"。由于该函数的返回类型为void,因此TypeScript会抛出一个类型错误,提示我们不能将字符串类型赋值给void类型。