TypeScript泛型:定义与联合的类型交集

时间:2020-04-18 07:07:47

标签: typescript typescript-typings typescript-generics

我正在构建一个TypeScript库,该库利用了另一个库中的某些接口。我试图通过通用类型和我无法控制的接口的交集来定义类型,并结合void之间的联合,这在依赖库中具有特殊含义。

我试图为所面临的问题创建一个最小的表示形式。

export type AllProps<Props> = (Props & IDependecyProps) | void;

interface MyProps {
  disableCache: boolean;
}

function doTheThing(props: AllProps<MyProps>) {
  // Property 'disableCache' does not exist on type 'AllProps'.
  //  Property 'disableCache' does not exist on type 'void'.ts(2339)
  console.log(props.disableCache);
}

我的目标是AllProps应该允许您指定disableCache以及IDependecyProps中的任何属性,或者类型指定为void。我依赖的库对于void类型有特殊的含义,这使其很有用。

编辑:我使代码示例太简单了,忘了添加泛型类型。

2 个答案:

答案 0 :(得分:0)

您可以在道具上使用类型断言,并检查属性是否存在,因为您的示例是boolean,因此我们需要检查它是否不是undefined

Read More Here


interface IDependecyProps {
    something: number
}
export type AllProps = (MyProps & IDependecyProps) | void;

interface MyProps {
  disableCache: boolean;
}

function doTheThing(props: AllProps) {

  if ( typeof((props as MyProps).disableCache)!=='undefined' )
  console.log((props as MyProps).disableCache);
}
doTheThing({ disableCache: false, something:1})

Playground

答案 1 :(得分:0)

简单的if将优化类型并排除void

function doTheThing(props: AllProps) {
  if (props) {
    console.log(props.disableCache); // props is narrowed to MyProps & IDependecyProps
  }
}

控制流分析将propsif的类型缩小为MyProps & IDependecyProps

无论如何也需要使用if来防止运行时出错(根据类型定义,props参数可以是undefined)。

Playground