请教一道 TypeScript 的面试题

2021-03-03 23:40:40 +08:00
 fdd

实现一个 ts 的工具函数 GetOnlyFnProps<T> ,提取泛型类型 T 中字段类型是函数的工具函数,其中 T 属于一个对象。

// 答案
type GetOnlyFnKeys<T extends object> = {
    [K in keyof T]: T[K] extends Function ? K : never
}[keyof T] // 不太理解这个地方

type GetOnlyFnProps<T extends object> = {
    [K in GetOnlyFnKeys<T>]: T[K]
}

// 测试用例
// 除了函数类型,其他都删除了
type obj = {
    a: () => string,
    b: number
}
type ccc = GetOnlyFnProps<obj>

let value:ccc = {
    a: () => '1'
}
996 次点击
所在节点    问与答
2 条回复
seki
2021-03-04 00:21:09 +08:00
T[K] extends Function ? K : never 是指如果 T[K] 不是 Function 的话,那类型就是 K,否则就是 never


{
[K in keyof T]: T[K] extends Function ? K : never
} 相当于排除掉了值类型不是 function 的,并且现在新的值是 K

再用 [keyof T] 取一下,拿到的就是 K 了

这种题你用实际的代码去类比比较合适,同时我觉得考 TypeScript 考这种和考茴的写法没什么区别,太专注于类型魔法了
yazoox
2021-03-04 09:23:58 +08:00
感觉像是三年高考五年模拟……
这类用法平时很少见,碰到了,学习研究一下就懂了。但是,过了一个礼拜,就忘了(可能我年纪大了吧……)。这面试和高考差不多了,这个知识点靠前要是没复习到,就 GG

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/758216

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX