TypeScript中的数据类型

102 阅读4分钟

什么是TypeScript?

TypeScript在语言特性方面和JavaScript基本一样,但是在用法上会有些许不同,可以这么说TypeScript是JavaScript的超集,也就是说,TS包含了JS。
TS与JS在使用中最大的不同点可能就是需要标注数据的类型了,下面总结了在TS中所有的数据类型以及它的用法。

TS的基础类型

在TS中,主要有这几种基础类型:boolean、number、string、array、tuple、enum、any、void、never,下面依次来说明这些类型的不同。

boolean(布尔类型)

布尔类型与JS中的布尔类型一样,只有两个取值,true或者false

let a:boolean=true
//a = 123  //报错
a = false  //正确

number(数字类型)

数字类型也和JS中一样,TS中所有的数字都是浮点数,TS不仅支持十进制和十六进制字面量,还支持二进制和八进制字面量

let decLiteral: number = 6;  //十进制
let hexLiteral: number = 0xf00d;  //十六进制
let binaryLiteral: number = 0b1010;  //二进制
let octalLiteral: number = 0o744;  //八进制

string(字符串类型)

和JS中一样,可以使用单引号('')和双引号("")表示字符串,也可以使用反引号(``),并且以${ expr }这种方式嵌入表达式

let name2: string = 'Gene';
let name1: string = "frank"
let age: number = 37;
let sentence: string = `Hello, my name is ${ name2 }.
I'll be ${ age + 1 } years old next month.`;

array(数组类型)

数组在TS中有两种声明方法,一种是在元素类型后面接上[],表示由此类型元素组成的一个数组,第二种是使用数组泛型Array<元素类型>

let list : number[] = [1,2,3];
let list : Array<number> = [1,2,3];

tuple(元组类型)

元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同。如果赋值的类型和数量与声明时的不一致,就会报错。

let x: [string, number];
x = ['hello', 10]; // OK
x = [10, 'hello']; // Error

enum(枚举类型)

使用枚举类型可以为一组数据赋予友好的名字,默认情况下,花括号中的数据会按数字0开始排列

enum Dir {东,南,西,北}
let d:Dir=Dir.东
console.log(d)       //0
console.log(Dir[0])  //东

当然你可以手动给数据赋值

enum Dir {东=2,南=1,西='hello',北=5}
console.log(Dir[0])  //undefined
console.log(Dir[2])  //东
console.log(Dir.西)  //'hello'

any(任意类型)

可以指定任意类型,一般是用于为那些在编程阶段还不清楚类型的变量指定一个类型

let num:any = 123;
num = 'str';   //OK
num = true;    //OK

void(空值类型)

某种程度上来说void类型与any类型相反,当一个函数没有返回值,那么这个返回值类型就是void

function a() : void {
    console.log('hello')
}

null和undefined

这两个类型的值就是类型名称,默认情况下null和undefined是所有类型的子类型,也就是说可以把null和undefined赋值给number类型的变量

let u: undefined = undefined;
let n: null = null;

Never

Never类型表示的是那些永不存在的类型,这个常常会出现在选择判断中

let a:number|string=123

if(typeof a === 'number'){
    a=321
}else if(typeof a === 'string'){
    a='321'
}else{
    a  //此时a类型推断为never
}

TS中的高级类型

交叉类型

让多种类型使用&符号连接起来,这样的一个新类型,就同时拥有了其他多种类型的特性,比如我们需要一个既有Person类型,又有Animal类型,就可以这样

type Person = {
    name:string,
    age:number,
    gender:'Male'|'Female'
}
type Animal = {
    variety:string,
    footNumber:number
}
type Cross = Person & Animal
let a:Cross={
    name:'fang',
    age:18,
    gender:'Male',
    variety:'human',
    footNumber:2,
}

但如果Person类型和Animal类型有一个相同key的类型是冲突的,那么这个类型就不存在了,表现为Never

联合类型

联合类型在语义上表现为,这个类型在之前就已经见过了,比如一个值,可以是number类型也可以是string类型,那么就可以用|运算符联合两个类型

let a:number|string
a=1   //ok
a='1' //ok

如果联合类型是两个对象联合,那么就会要求这个新的联合对象,一定要包含其中一个对象中完整的内容,另一个则不作要求,此时如果对象中的属性有冲突,也不会报错。

type Airplane = {
    fly:()=>void,
    length:string
}
type Car = {
    drive:()=>void,
    length:number
}
type Unit = Airplane | Car
let a:Unit={
    fly:()=>undefined,
    length:'100'
    //length:100  //如果为number就会报错,因为number不是Airplane的length属性
}