Как включить окно в качестве действительной опоры с помощью PropTypes?

Я пытаюсь определить свой список PropTypes для компонента класса. Компонент может принимать либо обычный элемент DOM, либо window в качестве значения реквизита. В настоящее время у меня есть:

class FooContainer extends Component {
    static propTypes = {
        container: PropTypes.oneOfType([
            PropTypes.element,
            PropTypes.instanceOf(Element),
        ]),
    };
    static defaultProps = {
        container: window,
    };
    constructor(props: any) {
        super(props);
    }
    render() {
        return (
            <div />
        );
    }
}

Однако, когда компонент по умолчанию использует window в качестве реквизита контейнера, выдается следующая ошибка:

Warning: Failed prop type: Invalid prop `container` supplied to `FooContainer`.

Таким образом, какой допустимый PropType использовать для свойства со значением window?


person haxxxton    schedule 03.07.2017    source источник
comment
Может PropTypes.instanceof(Window)?   -  person Andrew Li    schedule 03.07.2017
comment
@AndrewLi, Window не определено, если вместо этого я попробую window, я получу Failed prop type: Right-hand side of 'instanceof' is not callable. я думаю, window не является экземпляром? или не имеет метода instanceof.   -  person haxxxton    schedule 03.07.2017
comment
Как насчет instanceOf(window.constructor)   -  person Andrew Li    schedule 03.07.2017
comment
@AndrewLi, вот и мы: D, если вы вставите это в ответ, я не приму это   -  person haxxxton    schedule 03.07.2017


Ответы (1)


Что вы можете сделать, так это использовать oneOfType и включить экземпляр конструктора объекта window, Window:

PropTypes.instanceOf(window.constructor)

Это позволит использовать любой экземпляр Window в качестве значения реквизита.

person Andrew Li    schedule 03.07.2017
comment
Как насчет TypeScript? У меня есть эта ошибка в window.constructor: Аргумент типа «Функция» не может быть назначен параметру типа «новый (...аргументы: любой []) => неизвестный». Тип «Функция» не соответствует подписи «новый (...аргументы: любой []): неизвестный». ts (2345) - person Jakub Zawiślak; 11.07.2020