知食记
搜索文档…
设计工具类型(重要)
1
interface Part {
2
id: number;
3
name: string;
4
subparts: Part[];
5
updatePart(newName: string): void;
6
}
7
8
type R = FunctionPropertyNames<Part>;
Copied!
设计结果:
1
type FunctionPropertyNames<T> = { [K in keyof T]: T[K] extends Function ? K : never }[keyof T]
Copied!
结题思路
    1.
    假设我们把Part代入泛型T,[K in keyof T]相当于遍历整个interface
    2.
    这时K相当于interface的key,T[K]相当于interface的value
    3.
    接下来,用条件类型验证value的类型,如果是Function那么将value作为新interface的key保留下来,否则为never
    4.
    到这里我们得到了遍历修改后的interface即:
1
type R = {
2
id: never;
3
name: never;
4
subparts: never;
5
updatePart: "updatePart";
6
}
Copied!
特别注意: 这里产生的新interface R中的value是老interface Part的key,取出新interface R的value就是取出了对应老interface Part的key
但是我们的的要求是取出老interface Part的key,这个时候再次用[keyof T]作为key依次取出新interface的value,但是由于id namesubparts的value为never就不会返回任何类型了,所以只返回了'updatePart'.
最近更新 1yr ago
复制链接