TS类型系统

1.包装对象类型

1.1包装对象的概念

 定义:所谓“包装对象”,指的是这些值在需要时,会自动产生的对象。

* boolean
* string
* number
* bigint
* symbol
上面这五种原始类型的值,都有对应的包装对象(wrapper object)

* Boolean()
* String()
* Number()
以上三个构造函数,执行后可以直接获取某个原始类型值的包装对象。

注意,String()只有当作构造函数使用时(即带有new命令调用),才会返回包装对象。如果当作普通函数使用(不带有new命令),返回就是一个普通字符串。其他两个构造函数Number()和Boolean()也是如此

1.2包装对象类型与字面量类型

由于包装对象的存在,导致每一个原始类型的值都有包装对象和字面量两种情况。

'hello' // 字面量
new String('hello') // 包装对象

上面示例中,第一行是字面量,第二行是包装对象,它们都是字符串。

为了区分这两种情况,TypeScript 对五种原始类型分别提供了大写和小写两种类型。
* Boolean 和 boolean
* String 和 string
* Number 和 number
* BigInt 和 bigint
* Symbol 和 symbol
其中,大写类型同时包含包装对象和字面量两种情况,小写类型只包含字面量,不包含包装对象。

建议只使用小写类型,不使用大写类型。

2.Object 类型与 object 类型

2.1Object 类型

大写的Object类型代表 JavaScript 语言里面的广义对象。所有可以转成对象的值,都是Object类型,这囊括了几乎所有的值。

let obj:Object;
 
obj = true;
obj = 'hi';
obj = 1;
obj = { foo: 123 };
obj = [1, 2];
obj = (a:number) => a + 1;

除了undefinednull这两个值不能转为对象,其他任何值都可以赋值给Object类型

空对象{}Object类型的简写形式

显然,无所不包的Object类型既不符合直觉,也不方便使用.

2.2object 类型 

小写的object类型代表 JavaScript 里面的狭义对象,即可以用字面量表示的对象,只包含对象、数组和函数,不包括原始类型的值。

let obj:object;
 
obj = { foo: 123 };
obj = [1, 2];
obj = (a:number) => a + 1;
obj = true; // 报错
obj = 'hi'; // 报错
obj = 1; // 报错

注意,无论是大写的Object类型,还是小写的object类型,都只包含 JavaScript 内置对象原生的属性和方法,用户自定义的属性和方法都不存在于这两个类型之中。

const o1:Object = { foo: 0 };
const o2:object = { foo: 0 };

o1.toString() // 正确
o1.foo // 报错

o2.toString() // 正确
o2.foo // 报错

4.undefined 和 null 的特殊性

undefinednull既是值,又是类型。

作为值,它们有一个特殊的地方:任何其他类型的变量都可以赋值为undefinednull

有时候开发者不想这样做,比如下面的例子

const obj:object = undefined;
obj.toString() // 编译不报错,运行就报错

TypeScript 提供了一个编译选项strictNullChecks。只要打开这个选项,undefinednull就不能赋值给其他类型的变量(除了any类型和unknown类型)。

5.值类型

TypeScript 规定,单个值也是一种类型,称为“值类型”

let x:'hello';

x = 'hello'; // 正确
x = 'world'; // 报错

const命令声明的变量,如果没有注明类型,类型推断就会推断该变量的类型是值类型

// x 的类型是 "https"
const x = 'https';

// y 的类型是 string
const y:string = 'https';

注意,const命令声明的变量,如果赋值为对象,并不会推断为值类型。

// x 的类型是 { foo: number }
const x = { foo: 1 };

6.联合类型

联合类型(union types)指的是多个类型组成的一个新类型,使用符号|表示。

联合类型A|B表示,任何一个类型只要属于AB,就属于联合类型A|B

类型缩小

function printId(
  id:number|string
) {
  if (typeof id === 'string') {
    console.log(id.toUpperCase());
  } else {
    console.log(id);
  }
}

7.交叉类型

交叉类型(intersection types)指的多个类型组成的一个新类型,使用符号&表示。

let obj:
  { foo: string } &
  { bar: string };

obj = {
  foo: 'hello',
  bar: 'world'
};

8.type类型

type命令用来定义一个类型的别名。

type Age = number;

let age:Age = 55;

别名不允许重名。

type Color = 'red';
type Color = 'blue'; // 报错

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值