Как я могу применить функцию полезности к параметру супертипа типа generi c - PullRequest
0 голосов
/ 09 января 2020

Я даже не уверен, что правильно написал вопрос, поэтому возьмите его с крошкой соли. Я хотел бы знать, как применить функцию Omit <> к параметризованному значению типа generi c?

. Я хочу, чтобы это выдало ошибку компилятора, поскольку тег не должен поддерживаться * 1003. *

<ModalBody tag={'bjaisd'}></ModalBody>

Вот мой код типа модуля

declare module 'shards-react' {

  class BaseShardsComponent<T> extends React.Component<{
    className?: string,
    tag?: string | keyof HTMLElementTagNameMap,
  } & T> {}

  export class ModalBody extends BaseShardsComponent {}
}

Каким-то образом в реализации ModalBody я хочу получить доступ к параметризованному значению, определенному как

{
  className?: string,
  tag?: string | keyof HTMLElementTagNameMap,
} & T

И переносу весь этот союз в Omit<type, 'tag'>, но я понятия не имею, каким может быть синтаксис или вообще возможно ли это. Также я не хочу влиять на любые другие реализации, расширяющиеся от BaseShardsComponent. Это особый случай.

1 Ответ

0 голосов
/ 10 января 2020

Будет ли это работать в вашем случае использования:

import React from 'React';

module 'shards-react' {
    type Props = {
        className?: string,
        tag?: string | keyof HTMLElementTagNameMap,
    };
    class BaseShardsComponent<T> extends React.Component<Props & T> {}

    export class ModalBody<T> extends BaseShardsComponent<Omit<Props, 'tag'> & T> {}
}

?

Хотя, если нам разрешено менять реквизиты, я бы лучше сделал:

import React from 'React';

module 'shards-react' {
    type ModalBodyProps = {
        className?: string,
    };

    type BaseShardsComponentProps = ModalBodyProps & {
        tag?: string | keyof HTMLElementTagNameMap,
    }

    class BaseShardsComponent<T> extends React.Component<BaseShardsComponentProps & T> {}

    export class ModalBody<T> extends BaseShardsComponent<ModalBodyProps & T> {}
}

Если вы действительно не можете изменить BaseShardsComponentProps, то, возможно, это:

import React from 'React';

module 'shards-react' {
    class BaseShardsComponent<T> extends React.Component<{
        className?: string,
        tag?: string | keyof HTMLElementTagNameMap,
    } & T> { }

    type BaseShardsProps = React.ComponentProps<typeof BaseShardsComponent>

    export class ModalBody<T> extends BaseShardsComponent<Omit<BaseShardsProps, 'tag'> & T> {}
}
...