Adereços padrão com componente de classe
O uso static defaultProps
está correto. Você também deve usar interfaces, não classes, para props e state.
Atualização 2018/12/1 : O TypeScript aprimorou a verificação de tipo relacionada ao defaultProps
longo do tempo. Continue lendo para obter o melhor e mais recente uso, para usos e problemas mais antigos.
Para TypeScript 3.0 e superior
O TypeScript adicionou suportedefaultProps
especificamente para fazer com que a verificação de tipo funcionasse como você esperaria. Exemplo:
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>
);
}
}
Que pode ser renderizado e compilado sem passar um foo
atributo:
<PageComponent bar={ "hello" } />
Observe que:
foo
não está marcado como opcional (ou seja foo?: string
), mesmo que não seja necessário como um atributo JSX. Marcar como opcional significaria que poderia ser undefined
, mas na verdade nunca será undefined
porque defaultProps
fornece um valor padrão. Pense nisso de maneira semelhante a como você pode marcar um parâmetro de função como opcional ou com um valor padrão, mas não ambos, mas ambos significam que a chamada não precisa especificar um valor . O TypeScript 3.0+ trata de defaultProps
maneira semelhante, o que é realmente interessante para os usuários do React!
- O
defaultProps
não tem nenhum tipo de anotação explícita. Seu tipo é inferido e usado pelo compilador para determinar quais atributos JSX são necessários. Você pode usar defaultProps: Pick<PageProps, "foo">
para garantir a defaultProps
correspondência de um subconjunto de PageProps
. Mais sobre esta ressalva é explicada aqui .
- Isso requer que a
@types/react
versão 16.4.11
funcione corretamente.
Para TypeScript 2.1 até 3.0
Antes que o TypeScript 3.0 implementasse o suporte ao compilador, defaultProps
você ainda podia usá-lo, e funcionava 100% com o React em tempo de execução, mas como o TypeScript considerava apenas adereços na verificação de atributos JSX, seria necessário marcar adereços com padrões como opcionais ?
. Exemplo:
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>
);
}
}
Observe que:
- É uma boa idéia para anotar
defaultProps
com Partial<>
para que ele digita-cheques contra seus adereços, mas você não tem que fornecer a cada propriedade necessária com um valor padrão, que não faz sentido uma vez que as propriedades necessárias não deve nunca precisa de um padrão.
- Ao usar
strictNullChecks
o valor de this.props.foo
será possibly undefined
e será necessária uma asserção não nula (isto é this.props.foo!
) ou uma proteção de tipo (isto é,if (this.props.foo) ...
) para remover undefined
. Isso é irritante, uma vez que o valor padrão do suporte significa que ele nunca será indefinido, mas o TS não entendeu esse fluxo. Essa é uma das principais razões pelas quais o TS 3.0 adicionou suporte explícito defaultProps
.
Antes do TypeScript 2.1
Isso funciona da mesma forma, mas você não tem Partial
tipos, portanto, omita Partial<>
e forneça os valores padrão para todos os adereços necessários (mesmo que esses padrões nunca sejam usados) ou omita completamente a anotação de tipo explícita.
Você também pode usar os defaultProps
componentes da função, mas é necessário digitar sua função na interface FunctionComponent
( StatelessComponent
na @types/react
versão anterior 16.7.2
) para que o TypeScript conheça defaultProps
a função:
interface PageProps {
foo?: string;
bar: number;
}
const PageComponent: FunctionComponent<PageProps> = (props) => {
return (
<span>Hello, {props.foo}, {props.bar}</span>
);
};
PageComponent.defaultProps = {
foo: "default"
};
Observe que você não precisa usá-lo em Partial<PageProps>
nenhum lugar porque FunctionComponent.defaultProps
já está especificado como parcial no TS 2.1+.
Outra boa alternativa (é isso que eu uso) é desestruturar seus props
parâmetros e atribuir valores padrão diretamente:
const PageComponent: FunctionComponent<PageProps> = ({foo = "default", bar}) => {
return (
<span>Hello, {foo}, {bar}</span>
);
};
Então você não precisa de defaultProps
nada! Esteja ciente de que se você não fornecer defaultProps
em um componente função que ele terá precedência sobre valores de parâmetros padrão, porque Reagir sempre explicitamente passar os defaultProps
valores (para os parâmetros nunca são indefinido, assim, o parâmetro padrão nunca é utilizado.) Então você usaria um ou outro, não ambos.
static defaultProps
está correto. Você pode postar esse código?