编程语言可以分为动态类型和静态类型两种类型。动态类型,指的是变量的类型是在运行时决定的,而且随时会改变,JavaScript、Python、Ruby都是动态类型。静态类型,指的是变量的类型是在编译时决定的,而且无法改变,C++、C#和Java都是静态类型。
TypeScript本质上是加上静态类型和泛型、装饰器等特性的JavaScript,让我们写出更简洁和健壮的代码。
运行环境
目前浏览器和nodejs都不能直接运行TypeScript,所以需要将TypeScript代码转换为JavaScript代码才能运行。
安装TypeScript编译器tsc
:
npm i -g typescript
查看tsc
编译器的版本号,确定tsc
已安装:
tsc -v
编译TypeScript代码:
tsc index.ts
类型
TypeScript除了包含JavaScript中的基本类型(number, boolean,string...)外,还新增了any,unknown,never,tuple等类型。
// Number
let i: number = 0;
// Tuple
let user: [number, string] = [1, 'Tom'];
// Enum
enum Size { Small = 1, Medium, Large};
// Function
function sum(a: number, b: number): number {
return a + b;
}
// Object
let employee: {
id: number;
name: string;
} = {
id: 1,
name: 'Tom'
}
// Any
let anything: any = 0;
anything = 'tom';
需要特别注意的是any
类型,any
类型打破了TypeScript静态类型的特性!所以如果你没有想清楚你要做什么,尽量不要用any
!
类型进阶
- 类型别名(type alias)。通过类型别名可以给一个类型起一个新的名字。我们常用类型别名来创建自定义的类型。
type Employee = {
id: number;
name: string;
retire: (date: Date) => void
- 联合类型(union type)。创建一个可以有多种类型的变量。
let weight: number | string = 1;
weight = '1kg';
- 交叉类型(Intersection Types)。是将多个类型合并为一个类型。
type UIWidget = Draggable & Droppable;
- 字面量类型(Literal Types)。是 TypeScript 2.0 引入的一种新类型,它允许你将变量的值限制为某些特定的字面量值。
type Quantity = 50 | 100;
- 可为空类型(Nullable Types)。它允许在变量中存储一个值或null。
let name: string | null = null;
- 可选链(Optional Chaining)。是一种在访问对象属性时,如果属性不存在则返回
undefined
的语法。
customer?.birthdate?.getFullYear();
customers?.[0];
log?.('message');
- 空值合并运算符
??
(Nullish Coalescing Operator)。是一种特殊的操作符,用于处理TypeScript变量值。它的作用是判断变量值是否为 null 或 undefined,如果是,则返回一个默认值或一个新的值。
let val = '';
console.log(val ?? 'alright'); // 打印val的值,因为val不是null或undefined
console.log(val || 'alright'); // 打印alright,因为空字符视为false
-
unknown
类型。unkonwn
类型是any
类型的安全版本,推荐代替any
使用。因为unkonwn
类型的变量需要将它确定为具体的类型后才能对它进行操作。
function render(document: unknown) {
// 需要确定为具体的类型,才能进行操作
if (typeof document === 'string') {
// 将document作为string类型进行操作
}
}
-
never
类型。一般用never
类型来声明一个永不返回的函数(死循环),或者一个一定会抛出错误的函数。
function processEvents(): never {
while (true) {}
}
- 类型断言(Type Assertion)。可以用来手动指定一个值的类型。有时我们比编译器更清楚一个变量的类型,这时候就可以用类型断言。
// 将obj视为Person类型处理
obj as Person
网友评论