typescript 当存在其他属性时,将可选属性设置为必填属性

kmb7vmvb  于 2023-03-09  发布在  TypeScript
关注(0)|答案(3)|浏览(444)

我的 prop 类型如下所示

interface Props {
resource: string;
create?: boolean;
route?: string;
}

从上面可以看出,创建和路由是可选的 prop 。但是,我想实现的类型,如果创建 prop 是目前的路线,那么现在必须要求。任何人都有什么想法如何做到这一点?

6uxekuva

6uxekuva1#

您应该将这些 prop 分组,并使分组后的 prop 成为可选 prop ,如

interface RouteProps{
create: boolean;
route: string;
}

interface Props {
resource: string;
routeInfo?: RouteProps;
}
oknwwptz

oknwwptz2#

可以将其拆分为两种类型的并集,并将create与literal类型一起使用:

type Props = {
  resource: string;
  create?: false;
  route?: string
} | {
  resource: string;
  create: true;
  route: string;
}
rnmwe5a2

rnmwe5a23#

虽然我更喜欢@DevLoverUmar的解决方案。实际上,您可以选择使用typescript做类似这样的事情:
这可能就是您要查找的内容。但是您必须显式地设置TArgs<true>

type TArgs<T extends boolean> = {
   a: T,
   b: string,
   c: T extends true ? string : null
 }

使用工厂函数时的外观示例:

type TArgs<T extends true | false> = {
    a: T,
    c?: T extends true ? string : null
}

const argsFactory = <T extends boolean>(a: T, c: T extends true ? string : null): TArgs<T> => {
    return {
        a,
        c
    }
}

// Works
argsFactory(true, "string");
argsFactory(false, null);

// Doesnt Work
argsFactory(false, "some String");
argsFactory(true, null)

相关问题