我正在构建一个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
类型有特殊的含义,这使其很有用。
编辑:我使代码示例太简单了,忘了添加泛型类型。
答案 0 :(得分:0)
您可以在道具上使用类型断言,并检查属性是否存在,因为您的示例是boolean
,因此我们需要检查它是否不是undefined
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})
答案 1 :(得分:0)
简单的if
将优化类型并排除void
:
function doTheThing(props: AllProps) {
if (props) {
console.log(props.disableCache); // props is narrowed to MyProps & IDependecyProps
}
}
控制流分析将props
内if
的类型缩小为MyProps & IDependecyProps
。
无论如何也需要使用if
来防止运行时出错(根据类型定义,props
参数可以是undefined
)。