V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
fdd
V2EX  ›  问与答

请教一道 TypeScript 的面试题

  •  1
     
  •   fdd · 2021-03-03 23:40:40 +08:00 · 991 次点击
    这是一个创建于 1176 天前的主题,其中的信息可能已经有所发展或是发生改变。

    实现一个 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'
    }
    
    2 条回复    2021-03-04 09:23:58 +08:00
    seki
        1
    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
        2
    yazoox  
       2021-03-04 09:23:58 +08:00
    感觉像是三年高考五年模拟……
    这类用法平时很少见,碰到了,学习研究一下就懂了。但是,过了一个礼拜,就忘了(可能我年纪大了吧……)。这面试和高考差不多了,这个知识点靠前要是没复习到,就 GG
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1954 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 16:23 · PVG 00:23 · LAX 09:23 · JFK 12:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.