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;  
  在上面的例子中,我们尝试将一个bigint类型的值bigInt与一个number类型的值num相加,并将结果赋值给sum变量。这会引发一个类型错误,因为bigint和number是不同的类型。为了解决这个问题,我们可以使用Number函数将bigInt转换为number类型,然后再进行相加操作。

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类型。

posted @ 2023-10-03 00:05  左扬  阅读(68)  评论(0编辑  收藏  举报
levels of contents