从函数返回确切的泛型类型

时间:2019-05-14 22:05:35

标签: typescript types literals

请考虑以下情形: 我有一个函数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,但没有成功...

1 个答案:

答案 0 :(得分:0)

如果我理解正确的话,那么您可以使用将对象作为参数的函数。您想返回形状为{ def: objectParemeter }的对象,但是希望传入的对象类型保留在输出中。

如果是这种情况,类似的方法将起作用:

const createObj = <ObjType extends object>(obj: ObjType) => ({ def: obj })

如果您希望返回类型与某些类型完全匹配,可以执行以下操作:

const example2 = createObj<ExampleType>({ aaa: 'name' }) 

类型为{ def: ExampleType }

您可以使用此示例here