Я использую 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?





Вам должен быть присвоен тип defaultProps, а не только сам компонент:
static defaultProps: Props = {
counter: "i am not a number"
};
Это работает у вас в TypeScript 3.0? Проблема, которую я получаю при использовании этого подхода, заключается в том, что если я хочу назначить значения по умолчанию только некоторым из моих свойств, TypeScript выдаст ошибку, требующую, чтобы я назначил значения по умолчанию для всех свойств, определенных в интерфейсе Props.
В этом случае вы можете сделать defaultProps: Partial<Props> и сделать счетчик в Props counter?: string;.
Тоже не сработает. Эта проблема упоминается в связанных мной документах: 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).
См. github.com/DefinitiTyped/DefinitiTyped/issues/28515.