本文档为 TypeScript 的类型系统阅读笔记。

Keyof

type Arrayish = { [n: number]: unknown };
type A = keyof Arrayish; // number
type Mapish = { [k: string]: boolean };
type M = keyof Mapish; // string | number

这里需要留意 M 的类型是 string | number, 这是因为 JavaScript 对象中总是将 key 对待为一个 string 类型, 比如 obj[0] 与 obj['0'] 是等价的。

Typeof

需要注意「类型空间」与实际值的区别。

ReturnType<T> 为例:

function f() {
return { x: 10, y: 3 };
}
type P = ReturnType<f>;

直接操作值, 会报错 'f' refers to a value, but is being used as a type here. Did you mean 'typeof f'?。因此我们得使用 typeof 来将函数转化为类型空间。

function f() {
return { x: 10, y: 3 };
}
type P = ReturnType<typeof f>;

Indexed Access

可以结合使用 typeof 与 number 去获取数组元素的类型。

const MyArray = [
{ name: "Alice", age: 15 },
{ name: "Bob", age: 23 },
{ name: "Eve", age: 38 },
]
// type Person = {
// name: string;
// age: number;
// }
type Person = typeof MyArray[number];