javascript - Kako dekonstruirati objekt u Typescriptu kada su svojstva opcionalna?


Imam generičku komponentu koja ima neka opcionalna svojstva, trebam destrukturirati propertije, ali dobivam pogreške

    interface IScenarioPageProps extends IScenarioStateWithDispatch {
    isOverlayVisible?: boolean;
    renderOverlayContent?: () => void;
}

const Page = (props: IStepStateWithDispatch | IScenarioPageProps | ITaskStateWithDispatch) => {
    const { taskState, stepState, isOverlayVisible, renderOverlayContent } = props;
    const { selectedTaskId, selectedTask } = taskState;
    const { selectedStepId, selectedStep } = stepState;

    const style = StyleSheet.create({
        content: {
            'background-color': getTheme().palette.white,
            height: '100vh'
        }
    });

    return (
        <div className={css(style.content)}>
            {isOverlayVisible && <Modal>{renderOverlayContent()}</Modal>}
        </div>
    );
};

export default Page;

Kako mogu destrukturirati te opcionalne svojstva bez dobivanja TypeScript pogreške?

Odgovor #1

Budući da Page komponenta koristi renderOverlayContent prop bez obzira na sve, a prop nije predstavljen u tipu IStepStateWithDispatch ili ITaskStateWithDispatch (to je razlog pogreške), mogu pretpostaviti da želite da Page komponenta zahtijeva sve propove iz sučelja IStepStateWithDispatch, IScenarioPageProps i ITaskStateWithDispatch.

Ako je moje pretpostavka točna, tada trebate zamijeniti | s & u deklaraciji tipa props. To će TypeScriptu reći da objekt props ima svojstva iz svih sučelja.

const Page = (props: IStepStateWithDispatch & IScenarioPageProps & ITaskStateWithDispatch) => {
    // ...
}

Ako moja pretpostavka nije točna (komponenta je polimorfna), tada trebate provjeriti je li renderOverlayContent prop dan i zatim ga koristiti:

// ...

// const {renderOverlayContent} = props; // Remove this

return (
    <div className={css(style.content)}>
        {isOverlayVisible &&
            <Modal>
                {'renderOverlayContent' in props && props.renderOverlayContent && props.renderOverlayContent()}
            </Modal>
        }
    </div>
);