首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何推断泛型的泛型类型

如何推断泛型的泛型类型
EN

Stack Overflow用户
提问于 2022-07-22 07:57:21
回答 1查看 86关注 0票数 1

我有一个名为表达式的接口,它通过一个返回到自己,就像一个无限嵌套的结构。

我传入一个已经有泛型的泛型,我想推断它。

我有以下接口:

代码语言:javascript
复制
type Expression<T, U = string> = (T extends Approval<U> ? Approval<U> : Condition<U>) | OperatorExpression<T, U>

interface OperatorExpression<U, T = string> {
   operands: Expression<T, U>[]
   // other stuff
}

interface Approval<T = string> {
   approver: T
   // other stuff
}

interface Condition<T = string> {
   id: T
   // other stuff
}

然后,当我将表达式与具有非字符串泛型的泛型一起使用时,我必须这样称呼它:

代码语言:javascript
复制
Expression<Approval<Types.ObjectId>, Types.ObjectId>

我想这样称呼它:Expression<Approval<Types.ObjectId>>,基本上是根据第一个泛型的泛型推断出第二个泛型。

在我小小的ts知识中,我想要做这样的事情,但它抱怨是因为"S“不存在:

代码语言:javascript
复制
type Expression<T extends (Approval<S> | Condition<S>), U = S> = (T extends Approval<U> ? Approval<U> : Condition<U>) | OperatorExpression<T, U>

我怎么能这么做?谢谢

编辑

既然这个问题现在已经解决了,谢谢@Meowster,我将在这里把他的解决方案集成到我的用例中

代码语言:javascript
复制
type InferType<T> = T extends Approval<infer E> | WorkflowCondition<infer E> ? E : never;

type R<T> = InferType<T>

 export type Expression<T, U = R<T>> =
    | (T extends Approval<U> ? Approval<U> : T extends WorkflowCondition<U> ? WorkflowCondition<U> : WorkflowApproval<U>)
    | OperatorExpression<T, U>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-22 09:01:52

代码语言:javascript
复制
type Expression<T extends Approval | Condition> = T | OperatorExpression<T>

interface OperatorExpression<T extends Approval | Condition> {
   operands: Expression<T>[]
   // other stuff
}

interface Approval<U = any> {
   approver: U
   // other stuff
}

interface Condition<U = any> {
   id: U
   // other stuff
}

type E = OperatorExpression<Approval<number>>
type O = E['operands'] // Expression<Approval<number>>[]

或者使用推断语法

代码语言:javascript
复制
type InferType<T> = T extends Approval<infer E> | Condition<infer E> ? E : never;

interface Approval<T = string> {
    approver: T
    // other stuff
 }
 
 interface Condition<T = string> {
    id: T
    // other stuff
 }

 type R = InferType<Approval<number>> // R = number
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73076974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档