基础数据类型
为了方便记忆,我把基础数据类型分成了3部分,如下图
为变量添加注解(非引用类型)
一般来说,为类型添加注解都是在 变量名 后加 英文冒号(:),然后在 冒号 后面添加 类型名称 即可,语法如是:let variableName: typeName = value。
string
let s: string = "Hello World!";
let ms: string = `${s}!!`;
number
let n: number = 123;
boolean
let b: boolean = true;
bigint
let bigint: bigint = 123n;
symbol
let sym: symbol = Symbol('sym');
null
表示值不存在
let nl: null = null;
undefined
表示值未初始化
let u: undefined = undefined;
void
表示没有任何类型的值,当它用来检查变量时,和
undefined一致的效果,当它用来检查函数返回值时,表示没有值返回,或者返回值为undefined。
// 没有啥意义,一般不会这么写
let unusable: void = undefined;
// 没有返回值
function noReturn(): void {
console.log('I will never return!');
}
// 默认返回值,与不写返回值是一致的效果,不写返回值时内部默认返回 undefined
function defaultReturn(): void {
return undefined
}
never
表示的是那些永不存在的值的类型,换而言之,就是当程序被某种原因打断,无法到达终点时,此时的状态可以用 never 来约束。
never类型是任何类型的子类型,也可以赋值给任何类型;然而,没有类型是never的子类型或可以赋值给never类型(除了never本身之外)。 即使any也不可以赋值给never。
// 抛出错误,导致程序终止
function throwAError(): never {
throw new Error('An error occurred!');
}
// 无限循环,导致程序终止
function infiniteLoop(): never {
while (true) {
console.log('Infinite loop!');
}
}
// 用 never 约束 never
function fail(): never {
return throwAError();
}
// 将 never 类型赋值给其他类型
const f: string = fail();
any
表示任意类型的值,在无法得知变量类型时,去除类型检查
let any: any = 'Hello';
let ab: any = true;
let an: any = 123;
//...
为变量添加注解(引用类型)
object
它是所有引用类型的父类,也就是说,它可以用来约束所有的引用类型变量的值, 不过一般不会这么写,更多的是通过自定义一个约束类型对象去约束变量的值
// 一般不这么写
function Animal() { }
let animalConstructor: object = Animal;
let AnimalInstance: object = new Animal();
let date: object = new Date();
// 自定义一个约束类型对象去约束变量的值
let person: { name: string, age: number } = {
name: 'John',
age: 30
}
array
数组, 在 typescript 中, 数组的所有项都是同一类型,后面我们会提到数组的变种(元组),支持不同类型的值在同一个数组内。
当需要约束数组内部内容的类型时,可在
Array后面用尖括号(<>)将数组内值的类型包裹起来, 我们称之为数组泛型。另外,它还有个简写方式,就是类型 + []
// 完整写法
let list: Array<number> = [1, 2, 3];
// 简写
let l: number[] = [1, 2, 3];
元组
元组类型是另一种
Array类型,它确切地知道它包含多少个元素,以及它在特定位置包含哪些类型。
// 只有两个元素,多余的元素被访问时会报错
let tuple: [number, string] = [1, '2'];
tuple[2] // Error: Tuple type '[number, string]' of length '2' has no element at index '2'.
枚举
枚举允许开发人员定义一组命名常量。 使用枚举可以更容易地记录意图,或者创建一组不同的用例。 TypeScript提供了基于数字和基于字符串的枚举。
- 每个枚举成员都有自己的元素编号,元素编号可以是数字类型,也可以是字符串类型,当为数字类型时,从上往下依次递增,默认第一个成员的元素编号为0(如果不手动指定的话)
- 枚举元素编号支持运算,运算将在编译时完全求值
// 枚举类型
enum Color {
Red,
Green,
Blue
}
Color.Red // 0
// 成员编号手动指定
enum Food {
Apple = 1,
Banana,
Cherry
}
Food.Apple // 1
Food.Banana // 2
// 支持字符串
enum Apple {
Color = "COLOR",
Size = "SIZE",
Weight = "WEIGHT"
}
Apple.Color // "COLOR"
// 成员编号计算
enum Direction {
Up = 1 + 1,
Down,
Left,
Right
}
Direction.Up // 2