【问题标题】:Inferring Nested Generic Parameter and Returning It from Function推断嵌套的通用参数并从函数中返回它
【发布时间】:2019-10-29 21:21:13
【问题描述】:

我有一个这样的IModelDefinition

export interface IModelDefinition<MT extends Typegoose, QT> {
  model: new () => MT;
}

QT 并不直接用于接口本身,而是作为辅助函数传递给其他函数,这样 Typescript 可以自动推断 QT:

public async getSingleMatch<MT extends Typegoose, QT>(
    definition: ModelDefinition<MT, QT>,
    doc: QT
): Promise<MT> ...

我这样调用函数:

// Account is a ModelDefinition<AccountClass, {identifier: string} and
// if I remove the identifier string, it gives an error as I expect it to.
const account = await getSingleMatch(Account, {
      identifier: params.identifier,
});

在得到结果之前一切都是正确的。结果是Typegoose 类型,但它应该是AccountClass 类型。 我该如何解决这个问题?感谢您的帮助。

编辑:解决误解;我可以传递类型,但我构建它的全部原因是不传递类型并使其自动推断。没有办法吗?

【问题讨论】:

  • 您没有在泛型函数中传递类型,您只是将参数传递给函数。
  • 我可以传递类型,但我构建它的全部原因是不传递类型并使其自动推断。没有办法吗?

标签: javascript typescript generics interface nested


【解决方案1】:

我认为您还应该在调用函数时传递类型。

const account = await getSingleMatch<AccountClass, {identifier: string}>(Account, {identifier: params.identifier})

现在,如果您不希望每次调用函数时都传递类型并希望它推断 AccountClass,那么只需将默认类型 AccountClass 分配给泛型类型即可。

public async getSingleMatch<MT extends Typegoose = AccountClass, QT>(
    definition: ModelDefinition<MT, QT>,
    doc: QT
): Promise<MT> ...

【讨论】:

  • 我可以传递类型,但我构建它的全部原因是不传递类型并使其自动推断。没有办法吗?
  • 当你使一个函数泛型时,这意味着它可以是任何应该从该函数的调用传递的类型。
  • 但是如果我删除了&lt;extends Typegoose&gt; 子句,它会自动推断对吗?为什么这里不是这样?
  • 它在我的版本中自动推断 Typegoose,但我希望它改为推断 AccountClass
  • 无论你想让它推断什么,只要把它设为默认类型,并确保默认类型应该与扩展(Typegoose)类型兼容。
猜你喜欢
  • 2019-07-30
  • 2020-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-04
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多