数据类型对比
js 原始数据类型 | ts 新增数据类型 |
---|---|
number | tuple(元组) |
string | enum(枚举) |
boolean | any(任意类型) |
null | void(无类型) |
undefined | never(永不存在的值的类) |
object | |
symbol |
数据类型
- 布尔值 boolean
- 数字 number
- 字符串 string
- 数组 array
- 元组 tuple
- 枚举 enum
- 任意值 any
- 没有任何类型 void
- null、undefined
- 永不存在的值 never
- 非原始类型 object
布尔值、数字、字符串
相对简单
// 布尔值
let b: boolean = true;
// 数字
let n: number = 10;
// 字符串
let s: string = "ts";
数组
数组定义存在两种方法:
第一种:元素类型后接 []
let list: number[] = [1, 2, 3];
let list1: string[] = ["a", "b", "c"];
第二种:数组泛型 Array<元素类型>
let list2: Array<number> = [1, 2, 3];
元组
表示一个已知元素数量和类型的数组,各元素的类型不必相同。
let t: [string, number] = ["t", 1];
// 当访问越界元素时,会使用联合类型
// 即只要是订阅的类型都可以使用
t.push("s");
t.push("s");
// 这里会提示错误
t[100] = 2; // 不能将类型“2”分配给类型“undefined”。长度为 "2" 的元组类型 "[string, number]" 在索引 "100" 处没有元素。
枚举
使用枚举类型可以为一组数值赋予友好的名字。
// 枚举
enum Color {
Red,
Green,
Blue,
}
let c: Color = Color.Red;
默认情况下,从0
开始为元素编号
也可以手动的指定成员的数值,然后后面未指定的会递增
enum Color {
Red = 1,
Green,
Blue,
}
let c: Color = Color.Red;
或者,全部都采用手动赋值:
enum Color {
Red = 1,
Green = 3,
Blue = 5,
}
let c: Color = Color.Red;
我们也可以根据枚举的值得到对应的名字
let cName: string = Color[1];
any
不确定变量的类型
let a: any = 1;
a = "ts";
void
与 any 类型相反,它表示没有任何类型。当一个函数没有返回值,通常使用它表示
function v(): void {
console.log("void");
}
null、undefined
他们各个的类型就是他们本身,用处并不大。
never
永不存在值的类型。通常是抛出异常或者永远不会有返回值的类型
function nev(): never {
throw "123";
}
function infiniteLoop(): never {
while (true) {}
}
object
object表示非原始类型,也就是除number
,string
,boolean
,symbol
,null
或undefined
之外的类型
let o: object;
o = [1, 2, 3];
// o = 1; // 不能将类型“number”分配给类型“object”。
类型断言
好比类型转化。我们比编译器更明白某个值的详细信息,通过类型断言跳过对其的校验
let s: any = "this is ts";
let len: number = s.length;
上面定义的 s 类型为 any, 但实际的赋值为字符串。直接取值时有可能报错,但是我们确切的知道它就是字符串,此时就可以使用类型断言
类型断言有两种形式。 其一是“尖括号”语法:
let len: number = (<string>s).length;
另一个为as
语法:
let len: number = (s as string).length;