这种类型的重点是允许用户传入data, color, hasColor或data, info, hasInfo。不是任何其他组合。
type Props = {
data: string;
} & (
| {
info?: string;
hasInfo?: boolean;
color?: never;
hasColor?: never;
}
| {
info?: never;
hasInfo?: never;
color?: string;
hasColor?: boolean;
}
);
function foo(props: Props) {
console.log("bar");
}
foo({ data: "hello", info: "hello", hasInfo: true }); <----- TypeScript is happy
foo({ data: "hello", info: "hello", hasColor: true }); <----- TypeScript gives Error
有没有更简洁的方法来使用泛型来实现这种行为?
我试过这个,但看起来我以某种方式搞乱了三元的逻辑:
type Info = { info: string; hasInfo: boolean };
type Color = { color: string; hasColor: boolean };
type Data = { data: string };
function foo<T>(
props: keyof T extends keyof Info ? Data & Info : Data & Color
) {
console.log("bar");
}
foo({ data: "hello", color: "hello", hasColor: true }); <----TypeScript gives Error
第一种方法有效,但看起来很丑。