概述和基本定义
js的数据类型分为8种:
- string
- number
- boolean
- bigint
- symbal
- object
- undefined
- null
ts继承了js的类型设置,通常我们把这些类型称为ts的基本类型。
let a:string;
let c:number;
let c:boolean;
...
undefined和null即是type也是value,这两兄弟比较特殊,再除去object,剩下的五种类型就是js的最基本类型。
包装对象的概念
'hello'.length
只有对象才有属性和方法,上边的代码之所以能执行,是因为js在访问字符串属性的时候会自动转换为字符串对象,转换为的对象称之为包装对象,这个过程叫自动装箱
const s1:String = 'hello'; // 正确
const s2:String = new String('hello'); // 正确
const s3:string = 'hello'; // 正确
const s4:string = new String('hello'); // 报错
简单记录下,五种基本类型都对应有一个首字符大写的包装类型,我们只用小写就行。因为ts把很多js方法参数都定义为了小写,大写会报错的
let a:Number=5;
Math.abs(a);//报错
Object和object
Object代表广义对象,js有句话叫一切皆对象,说的就是此对象,但是它不包含null和undefined
const obj:Object
obj='star';
obj=18;
obj=null;//报错
const obj:{};//简写形式
object代表狭义对象,包含数组、对象、函数,不包含基本类型
值类型(字面量类型)
const hello='hello';
当const定义变量时,如果不是对象类型,会被推断为值作为类型,这个变量也只能被赋值成这个值,因为const定义的本来就是地址不变的常量
const obj={
name:"张三"
}
当const定义的变量是个对象,会被推断为对象,例如上边的例子,会被推断为{name:string}
const a:5=4+1//报错
const b:number=4+1//不报错
上边是会报错的特殊情况,开发中也不会用到,因为等号左侧计算完是number类型,number类型不属于5类型,所以报错,如果反过来就对了,因为5属于number类型,5是number的儿子。
联合类型
多种类型组合成的一种新类型叫联合类型,类型中间以|隔开
let a:string|number;
a = 5;
a = 'hello';
let b:string|boolean;
b = 'hello';
b=true;
交叉类型
多种类型组合成的一种新类型叫交叉类型,中间以&隔开。常用于对象类型的继承
let a:{a:string}&{b:number};
a={
a:'hello',
a:5
}
别名type
为了书写方便给一组类型定义一个新的名称
type Obj={
a:string,
b:string,
c:string,
}
let a:Obj;
别名一般首字符大写,同样的也可用联合类型、交叉类型和别名共同使用
type Obj={
a:string,
b:string,
c:string,
}
let a:Obj|number;//别名和联合类型使用
let b:Obj&{d:number};//别名和交叉类型使用
typeof的使用
js的typeof
typeof undefined; // "undefined"
typeof true; // "boolean"
typeof 1337; // "number"
typeof "foo"; // "string"
typeof {}; // "object"
typeof parseInt; // "function"
typeof Symbol(); // "symbol"
typeof 127n // "bigint"
ts的typeof
let a=5;
typeof a;//number
ts的typeof用于获取未知变量的类型
类型的兼容
let a:number|string;
let b=5;
a=b;
上边的例子 number和string类型包含number类型,所以不会报错