TypeScript
安装和编译
npm instaill -g typescript
tsc -v
查看安装tsc hello.ts
编译tsc
编译当前目录下所有ts文件,可配置tsconfig.json => outDir输出目录,否则会在所有对应ts的路径下生成jstsc --watch
自动监听变化并编译
语法
类型检测
- 类型检测
v: t
- 联合类型
v: t1 | t2
表示可以是t1或者t2 - 交叉类型
v: t1 & t2
表示t1和t2都要满足,若t1、t2有字段类型冲突,该字段为never
- 类型断言,当编译器根据类型检测判断结果类型可能多个,跟理想类型不符,就容易报错。但是开发者已人为断定结果的类型,知道自己在干嘛,有两种写法:
<t>v
(v as t)
- 参数或属性必定有值断言:
v!: t
- 类型推断, ts在变量定义时若未声明类型检测,会自动推断出一个类型(未赋值为
any
),当类型变化会报错
像new Boolean()这样的内置对象创建出来的值是包装类型,不属于基本类型boolean
基础类型
boolean
、number
、string
、undefined
、null
;undefined
和null
是所有类型的子类型,可以赋值给其他类型 ^nsArray
;数组内所有元素类型检测:v: t[]
或v: Array<t>
(泛型)symbol
enum
枚举类型,支持基于数字和字符串的枚举:成员名为汉字可能值为undefined
1 | enum Direction { |
1 | //加const修饰成为常量枚举 |
还有异构枚举:数字和字符串的混合
注意 枚举类型的值并不能用变量动态获取,只能传定值。动态获取应该使用 对象 + 索引签名
any
允许对此类型的值做任何操作无需任何检查,允许所有更改unknown
与any
一样无需任何检查;但unknown
类型变量只能赋值给unknown
和any
类型;由于类型未知,除赋值外禁止任何更改tuple
元组类型 与数组类似,但用于有限数量的未命名属性的类型,必须提供每个属性的值。各个元素类型可不同,可通过push
等方法新增未知类型元素1
2
3let v: [string, number]
v = ['2', 2]
//访问方式与数组一致- 元组和数组类型都可以通过数字索引访问其中一项的类型。还可以通过
[number]
获取到对应的联合类型(数组只有一项类型)
1
2
3
4
5type arr = string[][1] //string
type tuple = [number, string][1] //string
type arr = string[][number] //string
type tuple = [number, string][number] //number | string- 元组和数组类型都可以通过数字索引访问其中一项的类型。还可以通过
void
表示没有任何类型,与any相反;严格模式下只能为undefined
1
2
3
4
5// 声明函数返回值为void
//定义函数的()后跟`: t`声明返回值类型
function warnUser(): void {
console.log("This is my warning message");
}object
、Object
、和{}
object
表示非原始类型Object
所有 Object 类的实例的类型,由以下两个接口定义:Object 接口定义了 Object.prototype 原型对象上的属性;
1
2
3
4
5
6
7
8
9interface Object {
constructor: Function;
toString(): string;
toLocaleString(): string;
valueOf(): Object;
hasOwnProperty(v: PropertyKey): boolean;
isPrototypeOf(v: Object): boolean;
propertyIsEnumerable(v: PropertyKey): boolean;
}ObjectConstructor 接口定义了 Object 类的属性
1
2
3
4
5
6
7
8
9
10
11interface ObjectConstructor {
/** Invocation via `new` */
new(value?: any): Object;
/** Invocation via function calls */
(value?: any): any;
readonly prototype: Object;
getPrototypeOf(o: any): any;
// ···
}
declare var Object: ObjectConstructor;
{}
一个空对象,访问其属性会报错,但仍可使用Object接口上的所有方法
never
永不存在值的类型: 总是会抛出异常或根本就不会有返回值的函数表达式或箭头函数表达式的返回值。可以赋值给任何类型^ns
more >>Freshness: 对于对象类型,若对字面量进行类型检测,不允许已定义类型外的属性存在。如果不使用字面量而事先定义,则允许