ts-node 是一个非官方的 npm 模块,可以直接运行 TypeScript 代码。
npm install -g ts-node
ts-node script.ts
- 如果执行 ts-node 命令不带有任何参数,它会提供一个 TypeScript 的命令行 REPL 运行环境,你可以在这个环境中输入 TypeScript 代码,逐行执行。
ts-node
- 要退出这个 REPL 环境,可以按下 Ctrl + d,或者输入.exit。
TypeScript 提供了一个编译选项noImplicitAny,打开该选项,只要推断出any类型就会报错。
tsc --noImplicitAny app.ts
- 这里有一个特殊情况,即使打开了noImplicitAny,使用let和var命令声明变量,但不赋值也不指定类型,是不会报错的。
unknown跟any的相似之处,在于所有类型的值都可以分配给unknown类型。
- unknown类型的变量,不能直接赋值给其他类型的变量(除了any类型和unknown类型)。这就避免了污染问题,从而克服了any类型的一大缺点。
- 不能直接调用unknown类型变量的方法和属性。
- unknown类型变量能够进行的运算是有限的,只能进行比较运算(运算符==、===、!=、!==、||、&&、?)、取反运算(运算符!)、typeof运算符和instanceof运算符这几种,其他运算都会报错。
- TypeScript 有两个“顶层类型”(any和unknown),但是“底层类型”只有never唯一一个。
注意,如果没有声明类型的变量,被赋值为undefined或null,在关闭编译设置noImplicitAny和strictNullChecks时,它们的类型会被推断为any。如果希望避免这种情况,则需要打开编译选项strictNullChecks。
TypeScript 提供了一个编译选项strictNullChecks。只要打开这个选项,undefined和null就不能赋值给其他类型的变量(除了any类型和unknown类型)。
- 打开strictNullChecks以后,undefined和null这两种值也不能互相赋值了。
- 总之,打开strictNullChecks以后,undefined和null只能赋值给自身,或者any类型和unknown类型的变量。
联合类型可以与值类型相结合,表示一个变量的值有若干种可能。
let rainbowColor:'赤'|'橙'|'黄'|'绿'|'青'|'蓝'|'紫';
交叉类型常常用来为对象类型添加新属性。
type A = { foo: number };
type B = A & { bar: number };
- 上面示例中,类型B是一个交叉类型,用来在A的基础上增加了属性bar。
TypeScript 将typeof运算符移植到了类型运算,它的操作数依然是一个值,但是返回的不是字符串,而是该值的 TypeScript 类型。
const a = { x: 0 };
type T0 = typeof a; // { x: number }
type T1 = typeof a.x; // number
- 这种用法的typeof返回的是 TypeScript 类型,所以只能用在类型运算之中(即跟类型相关的代码之中),不能用在值运算。
子类型可以赋值给父类型,反之不可以
let a:'hi' = 'hi';
let b:string = 'hello';
b = a; // 正确,a是值类型hi,它是string类型的子类
a = b; // 报错,b是a的父类型,不可以