模块化和命名空间
ts 在模块化中遵循 esm 规范,而且推荐导入类型时前面加上 type 字段,这些可以让一个非TypeScript编译器比如Babel、swc或者esbuild知道什么样的导入可以被安全移除。
TypeScript有它自己的模块格式,名为namespaces,它在 ES 模块标准之前出现。命名空间在TypeScript早期时称之为内部模块,目的是将一个模块内部再进行作用域的划分,防止一些命名冲突的问题。虽然命名空间没有被废弃,但是由于ES模块已经拥有了命名空间的大部分特性,因此更推荐使用ES模块,这样才能与JavaScript的(发展)方向保持一致。
类型查找
.d.ts
文件称之为 类型声明 或者 类型定义 文件。
ts 查找类型声明:
- 内置类型声明
- 外部定义类型声明
- 自己定义类型声明
一些外部库拥有自己的类型声明文件,如 axios 内置在自己的包里。同时也有一些没有自己类型声明文件的,可以尝试安装 npm i @types/xxx
来安装其类型文件。
类型缩小(收窄)
// 1. typeof
function printID(id: number | string) {
if (typeof id === 'string') {
console.log("id is string type", id.length)
}
}
// 2. 相等运算符
type Direction = "left" | "right" | "up" | "down"
function switchDirection(direction: Direction) {
if (direction === "left") {
console.log("left", direction)
}
}
// 3. instanceof
function printDate(date: string | Date) {
if (date instanceof Date) {
console.log(date.getTime())
}
}
// 4. in 指定属性是否在指定的对象或者其原型链中
interface ISwim {
swim: () => void
}
interface IRun {
run: () => void
}
function move(animal: ISwim | IRun) {
if ("swim" in animal) {
console.log(animal.swim)
}
}