相关语法操作
&和|操作符
1001 | 1010 = 1001 // 合并1
1001 & 1010 = 1000 // 只保留共有1
在TypeScript中的表现:
interface IA {
a: string
b: number
}
type TB = {
b: number
c: number[]
}
type TC = IA | TB; // TC类型的变量的键只需包含ab或bc即可,当然也可以abc都有
type TD = IA & TB; // TD类型的变量的键必须包含abc
对于这种表现,可以这样立即:&表示必须同时满足多个契约,|表示满足任意一个契约即可。
extends关键字
在TypeScript中,extends既可当做一个动词来扩展已有类型;也可以当做一个形容词来对类型进行条件限定(例如用在泛型中)。在扩展已有类型时,不可以进行类型冲突的覆盖操作。例如,基类型中键a为string,在扩展出的类型中无法将其改为number。
type A = {
a: number
}
interface AB extends A {
b: string
}
// 与上一种等价
type TAB = A & {
b: string
}
条件类型
除了与、或等基本逻辑,TS的类型也支持条件运算,其语法与三目运算符相同,为T extends U ? X : Y。 这里先举一个简单的例子。在后文中我们会看到很多复杂类型的实现都需要借助条件类型。
type IsEqualType<A, B> = A extends B ? (B extends A ? true : false) : false;
type NumberEqualsToString = IsEqualType<number, string>; // false
type NumberEqualsToNumber = IsEqualType<number, number>; // true
环境Ambient Modules
在实际应用开发时有一种场景,当前作用域下可以访问其变量,但这个变量并不由开发者控制。例如通过Script标签直接引入的第三方库CDN、一些宿主环境的API等。这个时候可以利用TS的环境声明功能,来告诉TS当前作用域可以访问这些变量,以获得类型提醒。
具体有两种方式,declare和三斜线指令
declare const IS_MOBILE = true; // 编译后此行消失
const wording = IS_MOBILE ? '移动端' : 'PC端';
用三斜线指令可以一次性引入整个类型声明文件
/// <reference path="../typings/monaco.d.ts" />
const range = new monaco.Range(2, 3, 6, 7);