【发布时间】:2018-11-09 19:44:14
【问题描述】:
我想要一个函数,它接受一个带有可选键 (inst) 的对象,然后使用 inst 对象的键创建一个返回对象 - 例如:
function init( db, config ) {
let ret = {};
if ( config.inst ) {
for (let [key, value] of Object.entries(config.inst)) {
ret[ key ] = value+1; // would normally do some kind of processing here
}
}
return ret;
}
如果使用init( db, { inst: { a: 1, b: 2 } } ); 调用它,它将返回{ a: 2, b: 3 }。是的,它有点多余,但我可以尽可能简化我的想法!
虽然用 Javascript 编写代码很容易,但我终其一生都想不出一个接口,我应该为这个函数定义一个接口,让 TypeScript 处理返回的数据和类型。
让我感到困惑的关键是如何获取inst 嵌套对象的键。我知道我可以使用keyof 或in 获取对象的键,但我看不到如何在此处应用它。
非常欢迎任何帮助!
跟进 - 更改返回属性的类型
作为后续,此答案假定返回参数的类型将与为inst 传入的类型相匹配。如果类型改变了怎么办?例如将数字更改为字符串,反之亦然?
type Config<T extends {}> = {
inst?: T
}
function init<T extends {}>(db, config: Config<T>): T & {} {
let ret: any = {};
if ( config.inst ) {
for (let [key, value] of Object.entries(config.inst)) {
if ( typeof value === 'number' ) {
ret[ key ] = value.toString();
}
else {
ret[ key ] = parseInt( value, 10 );
}
}
}
return ret;
}
let { num, str } = init( null, { inst: { num: '1', str: 2 } } );
这样,被破坏的num 将是一个字符串,而str 将是一个数字,根据函数所做的“处理”,这是不正确的。有没有办法让 TypeScript 推断出正确的类型?
【问题讨论】:
标签: typescript types