# ts基本数据类型

# 布尔类型(boolen)

最基本的数据类型就是简单的true/false值。

let isDone: boolean = false;

# 数字类型(number)

TypeScript里的所有数字都是浮点数。 这些浮点数的类型是 number。 除了支持十进制和十六进制字面量,TypeScript还支持ECMAScript 2015中引入的二进制和八进制字面量。

let decLiteral: number = 6;
let hexLiteral: number = 0xf00d;
let binaryLiteral: number = 0b1010;
let octalLiteral: number = 0o744;

# 字符串类型(string)

可以使用双引号( ")或单引号(')表示字符串。

let str: string = "ts";
str = "typescript";

ts同样可以使用模板字符串

let name:string = 'tom';
let age:number = '18'
let info:string = `${name}今年${age}岁了`

# 数组类型(array)

**两种方式可以定义数组。 **

  • 第一种,可以在元素类型后面接上 [],表示由此类型元素组成的一个数组:
  • 第二种,是使用数组泛型,Array<元素类型>
let list: number[] = [1, 2, 3];

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

let arr: any[] = [1,'2',true]

# 元组类型(tuple)

元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同。

let _tuple: [string, number];
_tuple = ['hello', 10];
// 传入的数据类型必须与规定的对应
let _tuple1: [string, number];
_tuple1 = [10,'hello'];  // 错误

# 枚举类型(enum)

事先考虑某一个变量的所有的可能的值,尽量用自然语言中的单词表示它的每一个值 比如性别、月份、星期、颜色、单位、学历

默认从0开始

# 普通枚举

enum State {
    success=1,
    pending,
    error=-1
}
console.log(Color.pending) // 2 如果未指定值,则在前一个值得基础上加1
let success:State = State.success // 1

# 常数枚举

  • 常数枚举与普通枚举的区别是,它会在编译阶段被删除,并且不能包含计算成员。
  • 假如包含了计算成员,则会在编译阶段报错
const enum Colors {
    Red,
    Yellow,
    Blue
}
let myColors = [Colors.Red, Colors.Yellow, Colors.Blue];
const enum Color {Red, Yellow, Blue = "blue".length};

# 任意类型(any)

  • any就是可以赋值给任意类型
  • 第三方库没有提供类型文件时可以使用any
  • 类型转换遇到困难时
  • 数据结构太复杂难以定义
let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false;    // okay, definitely a boolean

有一个数组,它包含了不同的类型的数据:

let arr: any[] = [1, true, "free"];
arr[1] = 100;

# void类型

void类型像是与any类型相反,它表示没有任何类型。

一般用于定义函数没有返回值

function testVoid(): void {
    console.log("no return");
}

声明一个void类型的变量没有什么大用,因为你只能为它赋予undefined和null

let unusable: void = undefined;

# never类型

  • never是其它类型(null undefined)的子类型,代表不会出现的值

作为不会返回( return )的函数的返回值类型

// 返回never的函数 必须存在 无法达到( unreachable ) 的终点
function error(message: string): never {
    throw new Error(message);
}
let result1 = error('hello');
// 由类型推论得到返回值为 never
function fail() {
    return error("Something failed");
}
let result = fail();

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

# never和void的区别

  • void 可以被赋值为 null 和 undefined的类型。 never 则是一个不包含值的类型。
  • 拥有 void 返回值类型的函数能正常运行。拥有 never 返回值类型的函数无法正常返回,无法终止,或会抛出异常。

# null undefined

提示

默认情况下null和undefined是所有类型的子类型。可以把 null和undefined赋值给number类型的变量。

let x: number;
x = 1;
x = undefined;    
x = null;   

let y: number | null | undefined;
y = 1;
y = undefined;   
y = null;   

# 联合类型

  • 联合类型(Union Types)表示取值可以为多种类型中的一种
  • 未赋值时联合类型上只能访问两个类型共有的属性和方法
let name: string | number;
console.log(name.toString());
name = 3;
console.log(name.toFixed(2));
name = 'jc';
console.log(name.length);

# 类型断言

  • 类型断言可以将一个联合类型的变量,指定为一个更加具体的类型
  • 不能将联合类型断言为不存在的类型
let name: string | number;
console.log((name as string).length);
console.log((name as number).toFixed(2));
console.log((name as boolean)); // error

# 双重断言

interface Person {
    name: string;
    age: number;
}
const person = 'jc' as any as Person; // ok
Last Updated: 10/4/2021, 12:12:48 PM