Реквізити за замовчуванням з компонентом класу
Використання static defaultPropsправильно. Ви також повинні використовувати інтерфейси, а не класи, для реквізиту та стану.
Оновлення 2018/12/1 : TypeScript покращив перевірку типу, пов’язану з defaultPropsчасом. Читайте далі про найновіші та найбільші використання до старих звичаїв та проблем.
Для TypeScript 3.0 і новіших версій
TypeScript спеціально додав підтримку для того,defaultProps щоб зробити перевірку типу, як ви очікували. Приклад:
interface PageProps {
foo: string;
bar: string;
}
export class PageComponent extends React.Component<PageProps, {}> {
public static defaultProps = {
foo: "default"
};
public render(): JSX.Element {
return (
<span>Hello, { this.props.foo.toUpperCase() }</span>
);
}
}
Які можна візуалізувати та скласти, не передаючи fooатрибут:
<PageComponent bar={ "hello" } />
Зауважте, що:
fooце НЕ відзначений факультативним (тобто foo?: string) , навіть якщо це не потрібно в якості атрибута JSX. Позначення як необов'язкового означало б, що воно може бути undefined, але насправді цього ніколи не буде, undefinedоскільки defaultPropsзабезпечує значення за замовчуванням. Подумайте про це аналогічно тому, як ви можете позначити параметр функції необов'язково або зі значенням за замовчуванням, але не те і інше, але обидва означають, що виклику не потрібно вказувати значення . TypeScript 3.0+ ставиться defaultPropsаналогічно, що дуже здорово для користувачів React!
defaultPropsНе має ніякої явної анотації типу. Його тип визначається і використовується компілятором для визначення, які атрибути JSX потрібні. Ви можете використовувати defaultProps: Pick<PageProps, "foo">для забезпечення defaultPropsвідповідності підмножині PageProps. Більше про це застереження пояснюється тут .
- Це вимагає, щоб
@types/reactверсія 16.4.11працювала належним чином.
Для TypeScript 2.1 до 3.0
Перед тим, як TypeScript 3.0 підтримував компілятор, defaultPropsви все ще могли використовувати його, і він працював на 100% з React під час виконання, але оскільки TypeScript розглядав реквізити лише під час перевірки атрибутів JSX, вам доведеться позначати реквізити, які мають за замовчуванням як необов’язкові ?. Приклад:
interface PageProps {
foo?: string;
bar: number;
}
export class PageComponent extends React.Component<PageProps, {}> {
public static defaultProps: Partial<PageProps> = {
foo: "default"
};
public render(): JSX.Element {
return (
<span>Hello, world</span>
);
}
}
Зауважте, що:
- Це гарна ідея , щоб анотувати
defaultPropsз Partial<>так , що його типом перевірок в відношенні вашого реквізиту, але ви не повинні надавати все необхідне властивість із значенням за замовчуванням, що не має сенсу , так як необхідні властивості ніколи не повинні за замовчуванням.
- При використанні
strictNullChecksзначення this.props.foowill буде possibly undefinedі вимагає ненульового твердження (тобто this.props.foo!) або type-guard (тобто if (this.props.foo) ...) для видалення undefined. Це дратує, оскільки значення опорних значень за замовчуванням означає, що воно насправді ніколи не буде визначеним, але TS не зрозумів цього потоку. Це одна з головних причин TS 3.0 додала явну підтримку defaultProps.
Перед TypeScript 2.1
Це працює так само, але у вас немає Partialтипів, тому просто опустіть Partial<>або введіть значення за замовчуванням для всіх необхідних реквізитів (навіть якщо ці типові параметри ніколи не будуть використані) або повністю опустіть явну анотацію типу.
Ви також можете використовувати defaultPropsдля функціональних компонентів, але вам потрібно ввести свою функцію в інтерфейс FunctionComponent( до версії ), щоб TypeScript знав про функцію:StatelessComponent@types/react16.7.2defaultProps
interface PageProps {
foo?: string;
bar: number;
}
const PageComponent: FunctionComponent<PageProps> = (props) => {
return (
<span>Hello, {props.foo}, {props.bar}</span>
);
};
PageComponent.defaultProps = {
foo: "default"
};
Зауважте, що вам не потрібно Partial<PageProps>ніде користуватися, оскільки FunctionComponent.defaultPropsце вже вказано як часткове в TS 2.1+.
Ще одна приємна альтернатива (саме це я використовую) - деструктурувати ваші propsпараметри та призначати значення за замовчуванням безпосередньо:
const PageComponent: FunctionComponent<PageProps> = ({foo = "default", bar}) => {
return (
<span>Hello, {foo}, {bar}</span>
);
};
Тоді вам зовсім не потрібно defaultProps! Майте в виду , що якщо ви дійсно забезпечують defaultPropsна функції компонента буде мати пріоритет над значеннями параметрів по замовчуванню, тому що React буде завжди явно передати defaultPropsзначення (тому параметри ніколи не визначено, що параметр за замовчуванням ніколи не використовується.) Таким чином , ви будете використовувати той чи інший, не обидва.
static defaultPropsправильно. Чи можете ви опублікувати цей код?