Реквізити за замовчуванням з компонентом класу
Використання 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.foo
will буде 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/react
16.7.2
defaultProps
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
правильно. Чи можете ви опублікувати цей код?