基础类型

类型

和javascript一样,在typescript中,数据类型也分为原始类型(基础类型)和非原始类型。

  • 原始类型
  • number
  • string
  • boolean
  • symbol
  • null
  • undefined
  • 非原始类型
  • object
  • 数组
  • 元组Tuple
  • 枚举
  • 特殊类型
  • Any
  • void
  • never

重点

与javascript类型相比,在typescript中,我们需要重点需要了解新增的类型或者新的声明方式

数组

数组有以下两种声明方式

  • 元素类型后接上[],表示变量是一个数组,数组元素的类型是:后指定的类型
let list: string[] = ['foo', 'bar']
let arr: any[];
arr = [1,2,3,"4"]
  • 数组泛型
let list:Array <string> = ['foo', 'bar']

元组(Tuple)

元组和数组的最大区别是,元组的长度一般而言是确定的,(改变元组的长度会使用联合类型),而数组的长度可以改变。

// 声明元组x
let x: [string, boolean]

// 初始化x
x = ['foo', true]

// 改变数组
// 报错  Argument of type '3' is not assignable to parameter of type 'string | boolean'.
x.push(3) 

x.push('bar') // ok

枚举

枚举类型是对javascript标准数据类型的一个补充,目的是为了给一组数值赋值名字

默认情况下,从0开始为元素编号

enum Color {Red, Green, Blue}
let c: Color = Color.Green;

可以手动指定部分成员的值

enum Color {Red = 1, Green, Blue}
let c: Color = Color.Green;

全部指定值

enum Color {Red = 1, Green = 2, Blue = 4}
let c: Color = Color.Green;

Any

当不确定变量的数据类型时,可以使用any,类型检查器会忽略对标记为any的变量的类型检查。

Void

没有任何类型,一般会在函数中使用,表示函数没有返回值

function fn():void() {}

当一个变量为void类型时,只能为其赋值null或者undefined类型

let v: void;
v = null; // OK
v= undefined;  // OK
v = 1 //error TS2322: Type '1' is not assignable to type 'void'.

Null和Undefined

  • Null: 只有null为Null类型,这和javascript一样
  • Undefined:只有undefined为Undefined类型,这和javascript一样
  • null和undefined是所有类型的子类型(但不是never的子类型)

当指定–strictNullChecks标记,null和undefined只能赋值给void或各自类型。

Never

表示用不存在的类型

常见场景: 抛出异常或根本不会有返回值的函数表达式或者箭头函数表达式的返回值类型;

变量也可以是never类型

never是任何类型的子类型,可以赋值给任何类型

没有类型是nerver类型的子类型,any类型不可赋值给never

常见返回never类型的函数

// 返回never的函数必须存在无法达到的终点
function error(message: string): never {
    throw new Error(message);
}

// 推断的返回值类型为never
function fail() {
    return error("Something failed");
}

// 返回never的函数必须存在无法达到的终点
function infiniteLoop(): never {
    while (true) {
    }
}

类型断言

类型断言相当于类型转换,在编译阶段起作用,使用类型推断后,typescript类型检查器不会进行特殊的数据检查和解构。

  • 尖括号
let someValue: any = "this is a string";

let strLength: number = (<string>someValue).length;
  • as
let someValue: any = "this is a string";

let strLength: number = (someValue as string).length;

在typescript中使用JSX时,只有as语法断言是被允许的。

总结

在typescript类型中,相比于javascript,数据类型有了以下变化

  • 新增了enum,never,void类型
  • 对数组类型进行了细分,增加了元组Tuple
  • 相对于javascript的类型转化,这里增加了类型断言。

脑图

typescript 数组clear typescript 数组元素类型不确定_javascript