typescript - Villkorlig funktionstyp
Givet det följande scenariot,
function doSomething({ id, name, onSelect, onUnselect }: TDoSomething) {
if (onSelect) {
// I want `onUnselect` to be defined here
// ...
}
return { id, name }
}
type TDoSomething =
| IDoSomethingWithoutSelect
| IDoSomethingWithSelect
interface IDoSomethingWithoutSelect {
id: string
name: string
}
interface IDoSomethingWithSelect {
id: string
name: string
onSelect: (id: string) => void
onUnselect: (id: string) => void
}
Det jag vill göra är (konceptuellt?) enkelt: jag vill att onUnselect nödvändigtvis ska vara definierad om onSelect är det. Med andra ord, om jag skickar onSelect, då måste denna funktion också förvänta sig en onUnselect.
(En lekplats för dig kan nås här.)
Det visar sig att mina försök var misslyckanden. Jag vet inte exakt vad jag bör göra för att nå framgång.
(Detta är något annat jag har försökt göra)
Svar #1
Du kan använda in-operatorn för att begränsa argumenttypen till IDoSomethingWithSelect
function doSomething(arg: TDoSomething) {
const { id, name } = arg;
if ('onSelect' in arg) {
arg.onUnselect(id);
}
return { id, name }
}
