请考虑以下情形:
我有一个函数createObj
,它带有一个类型为ExampleType
的参数(它是对象),然后它创建一个属性为def
的新对象,其中包含提供的对象。我希望它也返回类型,其中包含与提供的类型完全相同的类型。看下面的例子:
type ExampleType = { aaa: string };
declare type MyFunc = <T>(obj?: ExampleType) => { def: O };
const myFunc: MyFunc;
const a = myFunc({aaa: 'name'});
目前它返回{ def: any }
,但是我希望它返回所提供的确切值-{ def: { aaa: 'name' } }
。有机会这样做吗?甚至更简单,请看一下:
const aObj = { a: true };
type aType = { a: true };
有什么方法可以使aObj
的类型等于aType
?
编辑: 好的,我发现了问题的部分答案(基于此:Create TypeSafe Object literal based upon existing object in TypeScript)。
function myFunc<O>(keysAndValuesObj: O) {
return { def: keysAndValuesObj } as {
def: { [K in keyof typeof keysAndValuesObj]: K };
};
}
const a = myFunc({
aaa: 'abc'
});
// now variable a is type of { def: { aaa: 'abc' } }
我现在需要做的就是将myFunc
的参数设为ExampleType
的类型。我尝试使用O
类型扩展ExampleType
,但没有成功...
答案 0 :(得分:0)
如果我理解正确的话,那么您可以使用将对象作为参数的函数。您想返回形状为{ def: objectParemeter }
的对象,但是希望传入的对象类型保留在输出中。
如果是这种情况,类似的方法将起作用:
const createObj = <ObjType extends object>(obj: ObjType) => ({ def: obj })
如果您希望返回类型与某些类型完全匹配,可以执行以下操作:
const example2 = createObj<ExampleType>({ aaa: 'name' })
类型为{ def: ExampleType }
您可以使用此示例here