У меня есть следующий HOC в React:
`restricted` prop
const ConditionalSwitch = ({component: Component, showIfTrue, ...rest}) => (
showIfTrue
? <Component {...rest}/>
: null
);
Как мне определить реквизит, чтобы Typescript был им доволен?
{component: Component, showIfTrue, ...rest}
Я старался
export interface CSProps {
component: any,
showIfTrue: boolean
}
Как мне справиться с ...rest здесь?





Попробуй это:
export interface CSProps {
component: any;
showIfTrue: boolean;
[key: string]: any;
}
Если вы хотите сохранить безопасность типов, вам нужно сделать ConditionalSwitch универсальным и сделать так, чтобы он выводил полные реквизиты, передаваемые компоненту, на основе фактического значения Component. Это гарантирует, что клиент ConditionalSwitch передаст все необходимые свойства используемого компонента. Для этого используем подход, описанный здесь:
const ConditionalSwitch = <C extends React.ComponentType<any>>({ Component, showIfTrue, ...rest}: { Component: C, showIfTrue: boolean} & React.ComponentProps<C> ) => (
showIfTrue
? <Component {...(rest as any) }/>
: null
);
function TestComp({ title, text}: {title: string, text: string}) {
return null!;
}
let e = <ConditionalSwitch Component = {TestComp} showIfTrue = {true} title = "aa" text = "aa" /> // title and text are checked
При передаче rest компоненту нам нужно использовать утверждение типа, потому что typescript не может понять, что { Component: C, showIfTrue: boolean} & React.ComponentProps<C> минус Component и showIfTrue просто React.ComponentProps<C>, но вы не можете иметь все это :)
Я получаю the left hand side of an arithmetic operation must be... в строке ? <Component {...(rest as any)}
@mikeb работает на меня. Какую версию ТС вы используете?
Машинопись 3.3.3333
@mikeb github.com/dragomirtitian/so-answers/tree/so-55004765 Я пробовал 3.3.1 и 3.4 (сейчас у меня нет 3.3.3333)
Я перезапустил Intellij и теперь получаю Cannot find name Component сразу после ? — он как будто не видит, что это аргумент.
Я не уверен, что следую в машинописном тексте, если вы хотите обозначить, что ваш компонент не должен иметь все свойства, которые вы можете использовать
Partials