我有个奇葩的需求,我需要在运行时改变 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
我该怎么来写返回值。。
1
momocraft 2018-09-11 17:29:27 +08:00
AFAIK 目前 TS3.0 没有这功能
|
2
kernel 2018-09-11 17:51:39 +08:00
你这种是动态了,和 ts 静态的命名不是完全反了吗,只能用 any
|
3
xfriday 2018-09-11 18:11:44 +08:00
interface R {
a?: string b?: string 'p-a'?: string 'p-b?': string } |
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 |
5
Debiancc 2018-09-11 18:17:23 +08:00
getter proxy 可能都是你想要的,但是 ts 的静态检查。。
`[key: string]: any` 安排上 |
6
mooncakejs 2018-09-11 18:21:23 +08:00 via iPhone
如果 p 是可选的某几个值,那就写几个重载声明就行,p 是无限的就没办法了
|
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} |
8
MinonHeart 2018-09-12 17:23:22 +08:00
interface Bar {
a: string; b: string; [k: string]: string; } |