Почему проверки на null / undefined не работают в классах с расширяемым интерфейсом реквизита в Typescript - PullRequest
1 голос
/ 26 июня 2019

Нулевые / неопределенные проверки не работают в классах, которые принимают общие реквизиты.

interface IFooProps {  
    minDate?: Date;
}

1 - это выдает «undefined не может быть назначен типу« Ошибка »в функции updateDate при вызове функции createNewDateWithMonth5

class Foo<P extends IFooProps> extends React.Component<P> {  

    updateDate() {  
        if (this.props.minDate) {  
            this.createNewDateWithMonth5(this.props.minDate)
        }
    }

    createNewDateWithMonth5(date: Date): Date {  
        const newDate = new Date(date);
        newDate.setMonth(5);
        return newDate;
    }
}

2 - это не дает ошибки и работает как ожидалось.

class Foo extends React.Component<IFooProps> {  

    updateDate() {  
        if (this.props.minDate) {  
            this.createNewDateWithMonth5(this.props.minDate)
        }
    }

    createNewDateWithMonth5(date: Date): Date {  
        const newDate = new Date(date);
        newDate.setMonth(5);
        return newDate;
    }
}

Я ожидал, что 1 будет работать как 2 без каких-либо ошибок. Почему проверки null / undefined не работают в расширяемых классах с расширяемыми реквизитами.

Вот песочница ссылка для воспроизведения ошибки.

1 Ответ

0 голосов
/ 26 июня 2019

Хм, не уверен, кажется немного странным, но, с другой стороны, я не удивлен - никогда не знаешь, что происходит в суперклассе.

Я бы кэшировал реквизит, а затем делал бы то же самое с кэшированным значением. Это должно быть надежно.

updateDate() {
    const { minDate } = this.props
    if (minDate ) {  
        this.createNewDateWithMonth5(minDate)
    }
}

Этот синтаксис "деструктуризации" также очень популярен в реагировании, так как он значительно сокращает код, так как нет необходимости писать "props" или "state" для каждой ссылки.

...