Увы конкретный тип может так работать только при наличии дискриминатора как в варианте 2 или жутких костылей как в варианте 1.
Однако, если вам это нужно для параметров некоей функции(или react компонента), то в случае передачи аргументом литерала оно может красиво работать с помощью пергрузок:
interface DefaultProps4 {
instantPopoup?: boolean;
// ...
}
interface PropsWithCb4 extends DefaultProps4 {
cb(): void;
}
interface PropsWithPath4 extends DefaultProps4 {
path: string;
}
type Magic = ((arg: PropsWithCb4) => 1) & ((arg: PropsWithPath4) => 2);
declare const magic: Magic;
// error
magic({
cb: () => {},
instantPopoup: true,
path: "df",
});
// 1, no error
magic({
cb: () => {},
instantPopoup: true,
})
// 2, no error
magic({
instantPopoup: true,
path: "df",
})
Но
только в случае литерала(установка пропсов в jsx - тоже считается литералом), вот так уже не сработает:
const trololo = {
cb: () => {},
instantPopoup: true,
path: "df",
}
magic(trololo); // 1, no error