TypeScript defaultProps не проверяет тип

Я использую TypeScript 3.0 и согласно документации от https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-0.html

Use static defaultProps: Pick<Props, "name">; as an explicit type annotation instead, or do not add a type annotation as done in the example above.

Однако если я напишу:

import React, { Component } from 'react';

interface Props {
  counter: number;
}

export default class NumberCounter extends Component<Props> {
  static defaultProps = {
    counter: "i am not a number"
  };

  render() {

    return (
      <div>{this.props.counter}</div>
    );
  }
}

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

<NumberCounter 
  counter = "still not a number"
/>

Он показывает ошибку и правильно проверяет тип при использовании в другом месте. Это известная ошибка TypeScript?

См. github.com/DefinitiTyped/DefinitiTyped/issues/28515.

Matt McCutchen 28.11.2018 02:21
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
1
334
1

Ответы 1

Вам должен быть присвоен тип defaultProps, а не только сам компонент:

static defaultProps: Props = {
    counter: "i am not a number"
};

Это работает у вас в TypeScript 3.0? Проблема, которую я получаю при использовании этого подхода, заключается в том, что если я хочу назначить значения по умолчанию только некоторым из моих свойств, TypeScript выдаст ошибку, требующую, чтобы я назначил значения по умолчанию для всех свойств, определенных в интерфейсе Props.

CodeIntern 27.11.2018 21:43

В этом случае вы можете сделать defaultProps: Partial<Props> и сделать счетчик в Props counter?: string;.

Shawn Andrews 27.11.2018 23:03

Тоже не сработает. Эта проблема упоминается в связанных мной документах: The default-ed properties are inferred from the defaultProps property type. If an explicit type annotation is added, e.g. static defaultProps: Partial<Props>; the compiler will not be able to identify which properties have defaults (since the type of defaultProps include all properties of Props).

CodeIntern 28.11.2018 19:17

Другие вопросы по теме