简单点说,凡是可以被变量存储的单元都是值。它可以是简单的字符串、数字,也可以是复杂的由多条语句组成的代码单元,如类、函数、对象等:
// 字符串作为值
let stringValue = 'hello world';
// 对象字面量作为值
let objectLiteralValue = {
attribute: 'hello world'
};
// 函数作为值
let funcValue = function(){};
// 函数返回作为值
function fn(){
return 'hello world';
}
let returnValue = fn();
// 类作为值
let classValue = class {}
在TypeScript中,所有的值都具有强制类型,值的类型化是TypeScript区别于JavaScript最显著的特征。
实际上,JavaScript也是有类型的,只不过JavaScript的类型信息是在编译阶段由编译器判定,对程序员来说,值可以任意赋予,编写代码时就好像类型弱的不存在一样
类型注解是指在源代码中显式指定值的类型,它的语法格式如下:
: 类型
冒号加类型构成了类型注解,冒号前后可以包含任意空格,以下都是合法的类型注解语法:
// 声明字符串类型变量
let str: string;
// 声明字符串类型变量并初始化
let strValue: string = 'hello world';
// 指定类的属性类型
class Hello {
show: boolean = true;
}
// 指定函数参数和返回值类型
function sum(a: number, b: number): number {
return a + b;
}
下表列举了TypeScript支持的所有类型,作为一个学习前的概览,在后续章节将会详细介绍:
类型 | 语法形式 |
---|---|
数字类型 | number |
布尔类型 | boolean |
字符串类型 | string |
符号类型 | symbol |
Void类型 | void |
Null类型 | null |
Undefined类型 | undefined |
Never类型 | never |
任意类型 | any |
数组类型 | T[] |
元组类型 | [T0, T1, ...] |
枚举类型 | enum T { ... } |
函数类型 | (p1: T1, p2: T2, ...) => T |
类类型 | T |
构造器类型 | new (p1: T1, p2: T2, ...) => R |
对象类型 | { ... } 或 interface T { ... } |
联合类型 | `T1 |
交叉类型 | T1 & T2 & ... |
日常开发中,类型注解是可选的,在绝大多数未显式注解类型的情况下,编译器能自动推导出值的类型
小技巧:如果你在编码时用肉眼能看出一个未注解值的类型,那么编译器也能推导出来
// 变量被自动推导为字符串类型 string
let variable = 'hello world';
// 等价于
let variable: string = 'hello world';
// 返回值被自动推导为数字类型 number
function show(param: number) {
return param;
}
// 等价于
function show(param: number): number {
return param;
}
类型查询是一条语句,相当于一个独立类型。代码中任何需要显式注解类型的地方,都可以使用类型查询代替:
: typeof 值
在JavaScript中,typeof
是一个用来判断值类型的关键字,在类型查询语法中有类似的作用。
// 声明a为number
let a: number;
// 通过类型查询声明b的类型
let b: typeof a;
// 等价于
let b: number;
// 函数fn为函数
function fn(){}
// 通过类型查询声明d的类型为fn的类型
let d: typeof fn;
// 等价于
let d: () => void;
类型注解、类型推导和类型查询构成了TypeScript的类型判定系统,TypeScript编译器判定值的类型时,主要是通过以上三种方式。