深入浅出TypeScript
TypeScript
.d.ts 和 declare 是干嘛用的
如果一个文件有扩展名 .d.ts
,则表示它是一个声明文件,可以用来声明全局的类型定义和接口,或者是其它模块。比如:
1 |
|
但是也不是说创建了.d.ts文件,里面声明的东西就能生效了,毕竟归根到底也是.ts文件,需要预编译,所以需要在tsconfig.json文件里面的include数组里面添加 global.d.ts
文件。
1 |
|
.d.ts
文件中的顶级声明必须以 “declare” 或 “export” 修饰符开头。通过declare
声明的类型或者变量或者模块,在include
包含的文件范围内,都可以直接引用。
1 |
|
注意.d.ts
文件顶级声明declare
最好不要跟export
同级使用,不然在其他ts
文件引用这个.d.ts
的内容的时候,就需要手动import导入了。
1 |
|
给对象分配动态(未知)属性
1 |
|
interface 和 type 有什么区别
接口
和类型别名
都可以用来描述对象的形状或函数签名。与
接口类型
不一样的是,类型别名
可以用于一些其他类型,比如原始类型、联合类型(|
)和元组。接口和类型别名都能够被扩展,但语法有所不同。此外,接口和类型别名不是互斥的。接口可以扩展类型别名,而反过来是不行的。
interface
扩展(接口、类型)使用extends
关键字,类型别名扩展(接口、类型)使用的是交叉类型(&)
:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15// 接口扩展
interface IPerson {
name: string;
}
interface IMe extends IPerson {
age: number;
}
// 类型扩展
type TPerson = {
name: string;
}
type TMe = TPerson & {
age: number;
}类可以以相同的方式实现(
implements
)接口或类型别名,但类不能实现使用类型别名定义的联合类型1
2
3
4
5
6
7
8
9
10
11
12
13// Error:
type PartialPoint = { x: number; } | { y: number; };
class SomePartialPoint implements PartialPoint { // 类只能实现具有静态已知成员的对象类型或对象类型的交集。ts(2422)
x = 1;
y = 2;
}
// Success
type PartialPoint = { x: number; } & { y: number; };
class SomePartialPoint implements PartialPoint {
x = 1;
y = 2;
}与类型别名不同,接口可以定义多次,会被自动合并为单个接口。
1
2
3
4
5
6
7
8
9
10
11
12interface IMerge {
a: 1;
}
interface IMerge {
b: 2
}
const ab: IMerge = {}; // 类型“{}”缺少类型“IMerge”中的以下属性: a, bts(2739)
// Error: 标识符“TOne”重复。ts(2300)
type TOne = string;
type TOne = number;
类型保护
- typeof
- instanceof
- in
参考资料
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!