TypeScript的基础类型
TypeScript 继承了 JavaScript 的类型,在这个基础上,定义了一套自己的类型系统。
概述
JavaScript语言(注意,不是TypeScript)将值分成8种类型。
- boolean
- string
- number
- bigint
- symbol
- object
- undefined
- null
TypeScript 继承了 JavaScript的类型设计,以上8种类型可以看作TypeScript的基本类型。
注意,上面所有类型的名称都是小写字母,首字母大写的Number、String、Boolean等在JavaScript语言中都是内置对象,而不是类型名称。
另外,undefined和null既可以作为值,也可以作为类型,取决于在哪里使用它们。
这8种基本类型是TypeScript类型系统的基础,复杂类型由它们组合而成。
以下是它们的简单介绍。
boolean 类型
boolean类型只包含true和false两个布尔值。
const a:boolean = true;
const b:boolean = false;
上面示例中,变量a和b就属于boolean类型。
string 类型
string类型包含所有字符串
const a:string='吃什么补什么,所以吃苦最终还是自己苦';
const b:string=`${a} 吃人才可以成功`;
上面示例中,普通字符串和模板字符串都属于 string 类型。
number 类型
number 类型包含所有整数和浮点数。
const a:number = 123;
const b:number = 3.14;
const c:number = 0xffff;
上面示例中,整数、浮点数和非十进制数都属于 number 类型。
bigint 类型
bigint 类型包含所有的大整数。
const a:bigint = 123n;
const b:bigin = 0xffffn;
上面示例中,变量a和b就属于 bigint 类型。
bigint 与 number 类型不兼容
const a:bigint = 123; // 报错
const b:bigint = 3.14 // 报错
上面示例中,bigint类型赋值为整数和小数,都会报错。
symbol 类型
symbol 类型包含所有的 Symbol 值。
const x:symbol = Symbol();
上面示例中,symbol()函数的返回值就是symbol 类型。
object 类型
根据 JavaScript的设定,object类型包含了对象、数组和函数。
const a:object = {name:'name'}
const b:object = [1,2]
const c:object = (n:number) => n + 1
上面示例中,对象、数组、函数都属于 object 类型。
undefined 类型,null 类型
undefined 和 null 是两种独立类型,它们各自都只有一个值。
undefined 类型只包含一个值 undefined,表示未定义(即还未给出定义,以后可能会有定义)
let a:undefined = undefined;
上面示例中,变量a就属于undefined类型。两个undefined里面,第一个是类型,第二个是值。
null类型也只包含一个值null,表示为空(即此处没有值)。
const a:null = null;
上面示例中,变量a就属于 null 类型。
注意,如果没有声明类型的变量,被赋值为undefined或null,它们的类型会被推断为any。
let a = undefined // any
let b = null // any
打开编译选项strictNullChecks
let a = undefined // undefined
let b = null // null
上面示例中,打开编译设置strictNullChecks以后,赋值为undefined的变量会被推断为undefined类型,赋值为null的变量会被推断为null类型。
包装对象类型
包装对象的概念
JavaScript的8种类型之中,undefined和null其实是两个特殊值,object属于复合类型,剩下的五种属于原始类型(primitive /ˈprɪmətɪv/ value),代表最基本的、不可再分的值。
- boolean
- string
- number
- bigint
- symbol 上面这五种原始类型的值,都有对应的包装对象(wrapper object)。所谓”包装对象“指的是这些值在需要时,会自动产生的对象。
'hello'.charAt(1) // 'e'
上面示例中,字符串hello执行了charAt()方法。但是,在JavaScript语言中,只有对象才有方法,原始类型的值本身没有方法。这行代码之所以可以运行,就是因为在调用方法时,字符串会自动转为包装对象,charAt()方法其实是定义在包装对象上。
这样的设置大大方便了字符串处理,省去了将原始类型的值手动转成对象实例的麻烦。
五种包装对象之中,symbol类型和bigint类型无法直接获取它们的包装对象(即Symbol()和BigInt()不能作为构造函数使用),但是剩下三种可以。
Boolean()String()Number()以上三个构造函数,执行后可以直接获取某个原始类型值的包装对象。
const s = new String('hello')
typeof s // 'object'
s.charAt(1) // 'e'
上面示例中,s就是字符串hello的包装对象,typeof运算符返回object,不是string,但是本质上它还是字符串,可以使用所有的字符串方法。
注意,String()只有当作构造函数使用时(即带有New 命令调用),才会返回包装对象。如果当作普通函数使用(不带有 new 命令),返回就是一个普通字符串。其他两个构造函数Number()和Boolean也是如此。
包装对象类型与字面量类型
由于包装对象对象的存在,导致每一个原始类型的值都有包装对象和字面量两种情况。
'hello' // 字面量
new String('hello') // 包装对象
上面示例中,第一行是字面量,第二行是包装对象,它们都是字符串。
为了区分这两种情况,TypeScript对五种原始类型分别提供了大写和小写两种类型。
- Boolean 和 boolean
- String 和 string
- Number 和 number
- Bigint 和 bigint
- Symbol 和 symbol
其中,大写类型同时包含包装对象和字面量两种情况,小写类型只包含字面量,不包含包装对象。
// 大写类型可以表示字面量
const s1:String = 'hello'
const s2:String = new String('hello')
// 小写类型没有办法表示 包装对象
const s3:string = 'hello'
// Type 'String' is not assignable to type 'string'. 'string' is a primitive,but 'String' is a wrapper object. Perfer using 'string' when possible.
const s4:string = new String('hello') // 报错
上面示例中,String类型可以赋值为字符串的字面量,也可以赋值为包装对象。但是,string类型只能赋值为字面量,赋值为包装对象就会报错。
建议只使用小写类型,不使用大写类型。因为绝大部分使用原始类型的场合,都是使用字面量,不使用包装对象。而且,TypeScript 把很多内置方法的参数,定义成小写类型,使用大写类型会报错。
const n1:number = 1;
cosnt n2:Number = 1;
// Math.asb:函数返回一个数字的绝对值。
Math.abs(n1) // 1
Math.abs(n2) // 报错
上面示例中,Math.abs()方法的参数类型被定义成小写的number,传入大写的Number类型就会报错。
结尾
上述摘要来自阮一峰老师的TS教程,好记性不如烂笔头,自己梳理一遍增加记忆力,每日更新自己的知识库。