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

2018-09-11 17:13:56 +08:00
 zzhbbdbbd

我有个奇葩的需求,我需要在运行时改变 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 我该怎么来写返回值。。

3072 次点击
所在节点    JavaScript
8 条回复
momocraft
2018-09-11 17:29:27 +08:00
AFAIK 目前 TS3.0 没有这功能
kernel
2018-09-11 17:51:39 +08:00
你这种是动态了,和 ts 静态的命名不是完全反了吗,只能用 any
xfriday
2018-09-11 18:11:44 +08:00
interface R {
a?: string
b?: string
'p-a'?: string
'p-b?': string
}
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
2018-09-11 18:17:23 +08:00
getter proxy 可能都是你想要的,但是 ts 的静态检查。。
`[key: string]: any` 安排上
mooncakejs
2018-09-11 18:21:23 +08:00
如果 p 是可选的某几个值,那就写几个重载声明就行,p 是无限的就没办法了
mooncakejs
2018-09-11 18:24:10 +08:00
function foo(obj: Bar):{a:string}
function foo(obj: Bar, prefix: 'p'):{pa:string}
function foo(obj: Bar, prefix: 'b'):{ba:string}
MinonHeart
2018-09-12 17:23:22 +08:00
interface Bar {
a: string;
b: string;
[k: string]: string;
}

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

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

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

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

© 2021 V2EX