TS的基础类型
  • Boolean类型
let isDo:boolean = true;   === var isDo = true
  • Number类型
let num:number = 5; === var num = 5
  • String类型
let name:string = 'mery'; === var name = 'mery'
  • Array类型
let arr:number[] = [1,2,3]; === var arr =[1,2,3]
let arr:Array<number> = [4,5,6]; //Array<number> 是泛型语法
  • Enum类型
  • 使用枚举可以清晰地表达意图或创建一组有区别的用例。TS支持数字和基于字符串的枚举。
数字枚举
enum Dir{
    NORTH,
    SOUTH,
    EAST,
    WEST
}
let dir:Dir = Dir.NORTH;
在默认情况下,NORTH的初始值为0,其余的成员会从1开始自动增长。

也可以设置初始值,如
enum Dir{
    NORTH = 3,
    SOUTH,
    EAST,
    WEST
}
字符串枚举
允许我们使用字符串枚举。在一个字符串枚举里,每个成员都必须用字符串字面量,或另外一个字符串枚举成员进行初始化。

enum Dir{
NORTH = "NORTH",
SOUTH = "SOUTH",
EAST = "EAST",
WEST = "WEST"
}
异构枚举
异构枚举的成员值是数字和字符串的混合。
enum Enum{
A,B,C = "C",D = "D",E=6,F
}

console.log(Enum.A) //输出:0
console.log(Enum[0]) // 输出:A
//数字枚举相对字符串枚举多了"反向映射"
  • Any类型
  • 在TS中,任何类型都可以被归为any类型,这让any类型成为了类型系统的顶级类型,也叫全局超级类型。
let noSure:any = 555;
noSure = "mery";
noSure = true;

TS允许我们对any类型的值执行任何操作,而无需事先执行任何形式的检查。

let value:any;
value.foo.bar; // OK
value.trim(); //OK
value(); //OK
new value(); //OK
value[0][1]; //OK

使用any类型,可以很容易地编写类型正确但在运行时有问题的代码。若我们使用any类型,就无法使用TS提供的大量的保护机制。

  • Unknown类型
  • 所有类型都可以赋值给unknown。
let value:known;

value =true ;// ok
value = 42; //ok
value = 'hello world'; //ok
value = []; //ok
value = {}; //ok
value = null; //ok 
value = undefined; //ok 
value = new TypeError(); //ok
value = Symbol("type"); // ok

let value1: unknown = value; // OK
let value2: any = value; // OK
let value3: boolean = value; // Error
let value4: number = value; // Error
let value5: string = value; // Error
let value6: object = value; // Error
let value7: any[] = value; // Error
let value8: Function = value; // Error

对value变量的所有赋值都被认为是类型正确的。但是unknown类型只能被赋值给any类型和unknown类型本身。只有能够保存任意类型的值的容器才能保存unknown类型的值。

let value: unknown;

value.foo.bar; // Error
value.trim(); // Error
value(); // Error
new value(); // Error
value[0][1]; // Error

将value变量类型设置为unknown后,已将所有允许所有更改的默认配置,更改为禁止任何更改。

  • Tuple类型(元组)
  • 在单个变量中储存不同类型的值,就需要使用元组。元组是TS中特有的类型,工作方式类似于数组。
  • 可用于定义具有有限数量的未命名属性的类型,每个属性都有一个关联的类型。使用元组时,必须提供每个属性的值。
let tupleTypr:[string,boolean];
tupleType = ['mery',true];
//按照正确的类型依次初始化tupleType的变量,和数组一样,我们可以通过下标来访问元组中的元素。

在元组初始化的时候,若出现类型不匹配的话,会提示错误。还必须提供每个属性的值,不然也会出现错误。
  • Void类型
  • void类型表示没有任何类型。当一个函数没有返回值时,就会见到其返回值类型是void。
// 声明函数返回值为void
function warnUser(): void {
  console.log("This is my warning message");
}

值得注意的是,声明一个void类型的变量没什么用,因为它的值只能为undefined或null

  • Null和Undefined类型
  • undefined和null两者有各自的类型分别为undefined和null
let u:undefined = undefined;
let n:null = null;

默认情况下,null和undefined是所有类型的子类型。我们可以将null和undefined赋值给number类型的变量。但若指定了–strict标记,null和undefined只能赋值给void和它们各自的类型。

  • Never类型
  • never类型表示的是那些永不存在的值的类型。例如,never类型是那些总是会抛出异常或根本就不会有返回值的函数表达式或箭头函数表达式的返回值类型。
// 返回never的函数必须存在无法达到的终点
function error(message: string): never {
  throw new Error(message);
}

function infiniteLoop(): never {
  while (true) {}
}
  • 在TS中,可以利用never类型的特性来实现全面性检查
type Foo = string | number;

function controlFlowAnalysisWithNever(foo: Foo) {
  if (typeof foo === "string") {
    // 这里 foo 被收窄为 string 类型
  } else if (typeof foo === "number") {
    // 这里 foo 被收窄为 number 类型
  } else {
    // foo 在这里是 never
    const check: never = foo;
  }
}