Accesorios predeterminados con componente de clase
El uso static defaultProps
es correcto. También debe usar interfaces, no clases, para los accesorios y el estado.
Actualización 2018/12/1 : TypeScript ha mejorado la verificación de tipos relacionada con defaultProps
el tiempo. Siga leyendo para conocer el uso más reciente y mejor hasta usos y problemas más antiguos.
Para TypeScript 3.0 y superior
TypeScript agregódefaultProps
específicamente soporte para hacer que la verificación de tipos funcione como es de esperar. Ejemplo:
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 se puede representar y compilar sin pasar un foo
atributo:
<PageComponent bar={ "hello" } />
Tenga en cuenta que:
foo
no está marcado como opcional (es decir foo?: string
), aunque no se requiere como un atributo JSX. Marcar como opcional significaría que podría ser undefined
, pero en realidad nunca lo será undefined
porque defaultProps
proporciona un valor predeterminado. Piénselo de forma similar a cómo puede marcar un parámetro de función opcional, o con un valor predeterminado, pero no ambos, pero ambos significan que la llamada no necesita especificar un valor . TypeScript 3.0+ trata defaultProps
de una manera similar, ¡lo cual es realmente genial para los usuarios de React!
- El
defaultProps
no tiene anotaciones de tipo explícito. Su tipo es inferido y utilizado por el compilador para determinar qué atributos JSX son necesarios. Puede usar defaultProps: Pick<PageProps, "foo">
para asegurarse de que defaultProps
coincida con un subconjunto de PageProps
. Más sobre esta advertencia se explica aquí .
- Esto requiere que la
@types/react
versión 16.4.11
funcione correctamente.
Para TypeScript 2.1 hasta 3.0
Antes de que TypeScript 3.0 implementara el soporte del compilador para defaultProps
usted, aún podía usarlo, y funcionaba al 100% con React en tiempo de ejecución, pero dado que TypeScript solo consideraba accesorios al verificar los atributos JSX, tendría que marcar los accesorios que tienen valores predeterminados como opcionales ?
. Ejemplo:
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>
);
}
}
Tenga en cuenta que:
- Es una buena idea para anotar
defaultProps
con Partial<>
lo que tipo de controles contra sus apoyos, pero no tiene que suministrar todos los bienes necesarios con un valor por defecto, que no tiene sentido ya que las propiedades requeridas no deben necesitar un defecto.
- Cuando se utiliza
strictNullChecks
el valor de this.props.foo
will be possibly undefined
y require una aserción no nula (es decir this.props.foo!
) o un protector de tipo (es decir if (this.props.foo) ...
) para eliminar undefined
. Esto es molesto ya que el valor de apoyo predeterminado significa que en realidad nunca será indefinido, pero TS no entendió este flujo. Esa es una de las principales razones por las que TS 3.0 agregó soporte explícito defaultProps
.
Antes de TypeScript 2.1
Esto funciona de la misma manera pero no tiene Partial
tipos, así que simplemente omita Partial<>
y proporcione los valores predeterminados para todos los accesorios necesarios (a pesar de que esos valores predeterminados nunca se utilizarán) u omita la anotación de tipo explícito por completo.
También puede usar defaultProps
componentes de funciones, pero debe escribir su función en la interfaz FunctionComponent
( StatelessComponent
en la @types/react
versión anterior 16.7.2
) para que TypeScript conozca defaultProps
la función:
interface PageProps {
foo?: string;
bar: number;
}
const PageComponent: FunctionComponent<PageProps> = (props) => {
return (
<span>Hello, {props.foo}, {props.bar}</span>
);
};
PageComponent.defaultProps = {
foo: "default"
};
Tenga en cuenta que no tiene que usarlo en Partial<PageProps>
ningún lugar porque FunctionComponent.defaultProps
ya está especificado como parcial en TS 2.1+.
Otra buena alternativa (esto es lo que uso) es desestructurar sus props
parámetros y asignar valores predeterminados directamente:
const PageComponent: FunctionComponent<PageProps> = ({foo = "default", bar}) => {
return (
<span>Hello, {foo}, {bar}</span>
);
};
¡Entonces no necesitas defaultProps
nada! Tenga en cuenta que si usted no proporciona defaultProps
en un componente de la función que tendrá prioridad sobre los valores de los parámetros por defecto, porque Reaccionar siempre pasar explícitamente los defaultProps
valores (por lo que los parámetros no están definidos, por lo tanto el parámetro por defecto no se usa nunca.) Así que tendría que utilizar uno u otro, no ambos.
static defaultProps
es correcto. ¿Puedes publicar ese código?