Skip to main content

Get Readonly Keys

获取只读字段

// 实现泛型GetReadonlyKeys<T>,GetReadonlyKeys<T>返回由对象 T 所有只读属性的键组成的联合类型。
interface Todo {
readonly title: string
readonly description: string
completed: boolean
}

type Keys = GetReadonlyKeys<Todo> // expected to be "title" | "description"

/**
* 思路
* 1 K 是 T 的 key 属性
* 2 利用 extends 的特性来校验 K 是不是 T 的属性 如果是 就进行 Equal 校验
* 3 校验通过就返回 K 不过就 never
*
* 总结 MyPick + MyReadonly 是 校验 对象属性小帮手
*/
type MyPick<T, K extends keyof T> = {
[Key in K]: T[Key];
};

type MyReadonly<T> = {
readonly [K in keyof T]: T[K];
};

type GetReadonlyKeys<T, K = keyof T> = K extends keyof T
? Equal<MyPick<T, K>, MyReadonly<Pick<T, K>>> extends true
? K
: never
: never;