V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
zzhbbdbbd
V2EX  ›  JavaScript

Hi 来问个关于 Typescript 的返回值问题

  •  
  •   zzhbbdbbd · 2018-09-11 17:13:56 +08:00 · 3169 次点击
    这是一个创建于 2266 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我有个奇葩的需求,我需要在运行时改变 object 的 key, 但是返回值是编译时的东西, 我需要怎样来写下面这个的返回值

    interface Bar {
      a: string;
      b: string;
    }
    
    function foo(obj: Bar, prefix?: string) {}
    
    /**
     * prefix: p
     *
     * return {
     *   p-a:xxx,
     *   p-b:xxx
     * }
     *
     * prefix: undefined
     *
     * return {
     *   a:xxx,
     *   b:xxx
     * }
     *
     */
    
    

    prefix 可能为任意的 string 我该怎么来写返回值。。

    8 条回复    2018-09-12 17:23:22 +08:00
    momocraft
        1
    momocraft  
       2018-09-11 17:29:27 +08:00
    AFAIK 目前 TS3.0 没有这功能
    kernel
        2
    kernel  
       2018-09-11 17:51:39 +08:00
    你这种是动态了,和 ts 静态的命名不是完全反了吗,只能用 any
    xfriday
        3
    xfriday  
       2018-09-11 18:11:44 +08:00
    interface R {
    a?: string
    b?: string
    'p-a'?: string
    'p-b?': string
    }
    nannanziyu
        4
    nannanziyu  
       2018-09-11 18:14:03 +08:00
    interface Bar {
    a: string;
    b: string;
    }

    function foo(obj: Bar, prefix?: string) {
    if (prefix === undefined) {
    return obj;
    }
    let rtn = {};
    Object.getOwnPropertyNames(obj).forEach(ele => rtn[`${prefix}-${ele}`] = obj[ele]);
    return rtn;
    }

    const bar: Bar = { a: 'avalue', b: 'bvalue' };
    console.log(foo(bar));
    console.log(foo(bar,'test'));

    playground link:
    http://www.typescriptlang.org/play/#src=interface Bar%20%7B%0D%0A%20%20a%3A string%3B%0D%0A%20%20b%3A string%3B%0D%0A%7D%0D%0A%0D%0Afunction foo(obj%3A Bar%2C prefix%3F%3A string)%20%7B%0D%0A%20%20%20%20if (prefix %3D%3D%3D undefined)%20%7B%0D%0A%20%20%20%20%20%20%20%20return obj%3B%0D%0A%20%20%20%20%7D%0D%0A%20%20%20%20let rtn%20%3D%20%7B%7D%3B%0D%0A%20%20%20%20Object.getOwnPropertyNames(obj).forEach(ele %3D> rtn%5B%60%24%7Bprefix}-%24{ele%7D%60%5D%20%3D%20obj%5Bele%5D)%3B%0D%0A%20%20%20%20return rtn%3B%0D%0A%7D%0D%0A%0D%0Aconst bar%3A Bar %3D { a%3A 'avalue'%2C b%3A 'bvalue'%20%7D%3B%0D%0Aconsole.log(foo(bar))%3B%0D%0Aconsole.log(foo(bar%2C'test'))%3B
    Debiancc
        5
    Debiancc  
       2018-09-11 18:17:23 +08:00
    getter proxy 可能都是你想要的,但是 ts 的静态检查。。
    `[key: string]: any` 安排上
    mooncakejs
        6
    mooncakejs  
       2018-09-11 18:21:23 +08:00 via iPhone
    如果 p 是可选的某几个值,那就写几个重载声明就行,p 是无限的就没办法了
    mooncakejs
        7
    mooncakejs  
       2018-09-11 18:24:10 +08:00 via iPhone
    function foo(obj: Bar):{a:string}
    function foo(obj: Bar, prefix: 'p'):{pa:string}
    function foo(obj: Bar, prefix: 'b'):{ba:string}
    MinonHeart
        8
    MinonHeart  
       2018-09-12 17:23:22 +08:00
    interface Bar {
    a: string;
    b: string;
    [k: string]: string;
    }
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   876 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 20:55 · PVG 04:55 · LAX 12:55 · JFK 15:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.