【问题标题】:Return exact generic type from function从函数返回精确的泛型类型
【发布时间】:2019-05-15 23:34:32
【问题描述】:

考虑以下场景: 我有一个函数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 的类型。我试图用ExampleType 类型扩展O,但没有成功......

【问题讨论】:

  • 您的问题含糊不清,包含许多代码中未显示的元素。对于您的最终 sn-p,您是否尝试过 type aType = typeof aObj;
  • @ChristianIvicevic,是的,但它返回{ a: boolean },我希望它返回{ a: true }

标签: typescript types literals


【解决方案1】:

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

如果是这样的话,这样的事情会起作用:

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

如果您希望返回类型与某些类型完全匹配,您可以这样做:

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

类型为{ def: ExampleType }

你可以试试这个例子here

【讨论】:

  • 谢谢,它工作正常,除了它不返回确切的类型(对于字符串,它被称为“字符串文字”)。我更新了我的问题,因为我找到了我的问题的部分解决方案。看看吧,也许现在你能帮到我了。
  • Typescript 不会将对象文字的形状与恰好是同一事物的另一个自定义类型匹配。您需要在类型断言或泛型中使用该类型。我在链接的操场上有这样的例子。更新的答案,包括您的新代码,它为您提供所需的类型{ def: ExampleType }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多