[英]TypeScript: How do I narrow / write a guard for a complex conditional type?
給定以下MultiselectValue
條件類型,如何根據multiple
的值或通過Comp
中的守衛將其解析為LabeledValue<T>
或Array<LabeledValue<T>>
?
export interface LabeledValue<T = unknown> {
label: string;
value: T;
}
export type MultiselectValue<T, Multiple> = Multiple extends (undefined | false)
? LabeledValue<T>
: Array<LabeledValue<T>>;
export type MultiselectProps<T, Multiple extends boolean | undefined> = {
multiple: Multiple;
value: MultiselectValue<T, Multiple>;
}
Comp({
multiple: true,
value: [{ // tsc complains if not an array (as expected) because 'multiple' is 'true'
label: 'Option 1',
value: 5
}]
});
function Comp<T, Multiple extends boolean | undefined = undefined>(props: MultiselectProps<T, Multiple>) {
const { multiple, value } = props;
if (multiple) {
// value is an arrray here
} else {
// value is a string here
}
}
最簡單的方法是實際更改MultiselectProps
的定義:
type MultiselectProps<T, Multiple extends boolean | undefined> = Multiple extends (undefined | false) ? {
multiple: Multiple;
value: LabeledValue<T>;
} : {
multiple: Multiple;
value: Array<LabeledValue<T>>;
};
現在,在 function 主體中, props
是一個可區分的聯合(未解析類型),這意味着您可以像以前那樣縮小它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.