Adereços padrão com componente de classe
O uso static defaultPropsestá 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 defaultPropslongo 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 fooatributo:
<PageComponent bar={ "hello" } />
Observe que:
foonã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á undefinedporque defaultPropsfornece 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 defaultPropsmaneira semelhante, o que é realmente interessante para os usuários do React!
- O
defaultPropsnã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 defaultPropscorrespondência de um subconjunto de PageProps. Mais sobre esta ressalva é explicada aqui .
- Isso requer que a
@types/reactversão 16.4.11funcione corretamente.
Para TypeScript 2.1 até 3.0
Antes que o TypeScript 3.0 implementasse o suporte ao compilador, defaultPropsvocê 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
defaultPropscom 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
strictNullCheckso valor de this.props.fooserá possibly undefinede 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 defaultPropscomponentes da função, mas é necessário digitar sua função na interface FunctionComponent( StatelessComponentna @types/reactversão anterior 16.7.2) para que o TypeScript conheça defaultPropsa 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.defaultPropsjá está especificado como parcial no TS 2.1+.
Outra boa alternativa (é isso que eu uso) é desestruturar seus propsparâ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 defaultPropsnada! Esteja ciente de que se você não fornecer defaultPropsem um componente função que ele terá precedência sobre valores de parâmetros padrão, porque Reagir sempre explicitamente passar os defaultPropsvalores (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 defaultPropsestá correto. Você pode postar esse código?