安装 TypeScript
执行命令行
npm install -g typescript
会在全局环境下安装 tsc 命令,安装完成之后,我们就可以在任何地方执行 tsc 命令了。
编译一个 TypeScript 文件很简单:
tsc hello.ts
我们约定使用 TypeScript 编写的文件以 .ts 为后缀,用 TypeScript 编写 React 时,以 .tsx 为后缀。
原始数据类型
JavaScript 的类型分为两种:原始数据类型(Primitive data types)和对象类型(Object types)。
原始数据类型包括:布尔值、数值、字符串、null
、undefined
以及 ES6 中的新类型 Symbol
。
本节主要介绍前五种原始数据类型在 TypeScript 中的应用。
-
布尔值
let isDone: boolean = false;
-
数值
let decLiteral: number = 6;
-
字符串
let myName: string = 'Tom';
// 模板字符串
let sentence: string = `Hello, my name is ${myName}.
I'll be ${myAge + 1} years old next month.`;
-
Null 和 Undefined
let u: undefined = undefined;
let n: null = null;
tips:undefined 和 null 是所有类型的子类型。也就是说 undefined 类型的变量,可以赋值给 其他 类型的变量,例如赋值给number类型的变量:
// 这样不会报错
let num: number = undefined;
// 这样也不会报错
let u: undefined;
let num: number = u;
-
空值
JavaScript 没有空值(Void)的概念,在 TypeScript 中,我们用 void 表示没有任何返回值的函数:
function alertName(): void {
alert('My name is Tom');
}
任意值
字面意思就是允许赋值为所有类型,包括简单数据类型和复杂数据类型。
对于普通数据类型,在赋值过程中是不可以改变类型的,否则会报错:
let myFavoriteNumber: string = 'seven';
myFavoriteNumber = 7;
// index.ts(2,1): error TS2322: Type 'number' is not assignable to type 'string'.
但如果是any类型,赋值过程中改变类型是允许的:
let myFavoriteNumber: any = 'seven';
myFavoriteNumber = 7;
因为是any类型,可以是数组,可以是对象,所以
- 在任意值上访问任何属性都是允许的
let anyThing: any = 'hello';
console.log(anyThing.myName);
console.log(anyThing.myName.firstName);
- 也允许调用任何方法:
let anyThing: any = 'Tom';
anyThing.setName('Jerry');
anyThing.setName('Jerry').sayHello();
anyThing.myName.setFirstName('Cat');
可以认为,声明一个变量为任意值之后,对它的任何操作,返回的内容的类型都是任意值。
类型推论
如果没有明确的指定类型,那么 TypeScript 会依照类型推论(Type Inference)的规则推断出一个类型
在ts中,以下代码虽然没有指定类型,但是会在编译的时候报错:
let myFavoriteNumber = 'seven';
myFavoriteNumber = 7;
// index.ts(2,1): error TS2322: Type 'number' is not assignable to type 'string'.
事实上,它等价于:
let myFavoriteNumber: string = 'seven';
myFavoriteNumber = 7;
TypeScript 会在没有明确的指定类型的时候推测出一个类型,这就是类型推论。
如果定义的时候没有赋值,不管之后有没有赋值,都会被推断成 any 类型而完全不被类型检查,不会报错
let myFavoriteNumber;
myFavoriteNumber = 'seven';
myFavoriteNumber = 7;
tips:注意变量被推导成any类型的关键点,在于我们定义一个变量之后,有没有立即赋值。定义之后没有赋值,以后就会定义为any类型,如果定义之后,第一次赋值是string,就会推导为string类型。