<笔记>TypeScript入门-基础类型

185 阅读2分钟

JS本身是弱类型语言,对于变量类型不做限制,同一个变量可以赋值任何类型的数据。TypeScript 则取消了这种随心所欲,要求数据类型必须和声明的相同。

布尔/字符串/数值

let isDone: boolean = false;
let myname: string = "lyra";let num: number = 9;

数组

数组有两种形式

// 第一种(数据类型[])
let list: number[] = [1,2,3];
// 第二种(数组泛型: Array<数据类型>)
let list: Array<number> = [1,2,3];

元组Tuple(狭义的数组)

元组其实也是数组,但是它已知数组的长度和每个元素的类型。

let list: [string, number]; // declare a tuple type
console.log(list[1].substr(1)); // ❌Error: number does not have ‘substr’

对于超过数组范围,如list[2]等,会使用联合类型,联合类型是高级类型。

枚举类型(狭义的数组)

枚举类型本质上也是数组,但是它已知数组长度且默认元素的值是数组的索引,并且给数组的每个元素赋予了一个语义化的变量名。

enum Color {Red, Green, Blue}; 
let c:Color = Color.Red; // c默认是0,依次递增1,2,3...

可以手动给变量赋值, 可以是数值,也可以是其他值

// 数值
enum Color {Red=1, Green=4, Blue};
let c: Color = Color.Blue; // 5
// 字符串
enum Color {Red="red", Green="green", Blue="blue"};
let c: Color = Color.Blue; // "blue"

还可以通过枚举的数值类型的值查找对应的位置的变量名。

enum Color {Red=3, Green, Blue};
let colorName: string = Color[4]; // "Green"
// 如果将枚举值设为字符串,则不能查找变量名

any

any类型对变量类型不做限制,类型检查器不对其进行校验,可以接受任意类型的值。

let a: any = 5;
a = "hello"; // ✅

any类型会将数据类型默认是Object,可以对其调用任何方法,类型检查器不会报错!

let notSure: any = 4;
notSure.ifItExists(); // okay, ifItExists might exist at runtime

void

和any相反,没有任何类型。当函数无返回值时,其返回值类型是void。

void类型可以赋值undefinednull

function fn(): void {
  // todo
}

Null和Undefined

null和undefined默认是所有类型的子类型。

let num: number = 5;
num = null;

如果tsConfig中设置了--strictNullCheckstrue。null和undefined只能赋值给void。

此时上面的示例

let num: number = 5;
num = null; // ❌Error:type "null" is not assignable to type "number"

Never

never类型主要用于以下场景:

     1)函数必须存在无法到达的终点

function initiateLoop(): never {
      while(true){}
}

     2)总是抛出异常

function error(message: string): never {
    throw new Error()
}
function fail() {
    return error("failed"); // 推断返回异常
}

never默认是所有类型的子类型。

Object

object类型是除了string,number,boolean,null,undefined,symbol之外的类型。

declare function create(o: object | null);

create({prop: 0});
create([]);

类型断言

类型断言类似强制类型类型转换,告诉编译器不需要检查,我一定是对的。

有两种类型断言:

1)尖括号(<>)

let someValue:any = "hello";let strLen: number = (<string>someValue).length;

 2)as

let someValue:any = "hello";let strLen: number = (someValue as string).length;

但是在JSX语法中,只能使用as.