Accesorios predeterminados con componente de clase
El uso static defaultPropses 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 defaultPropsel 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 fooatributo:
<PageComponent bar={ "hello" } />
Tenga en cuenta que:
foono 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á undefinedporque defaultPropsproporciona 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 defaultPropsde una manera similar, ¡lo cual es realmente genial para los usuarios de React!
- El
defaultPropsno 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 defaultPropscoincida con un subconjunto de PageProps. Más sobre esta advertencia se explica aquí .
- Esto requiere que la
@types/reactversión 16.4.11funcione correctamente.
Para TypeScript 2.1 hasta 3.0
Antes de que TypeScript 3.0 implementara el soporte del compilador para defaultPropsusted, 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
defaultPropscon 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
strictNullChecksel valor de this.props.foowill be possibly undefinedy 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 Partialtipos, 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 defaultPropscomponentes de funciones, pero debe escribir su función en la interfaz FunctionComponent( StatelessComponenten la @types/reactversión anterior 16.7.2) para que TypeScript conozca defaultPropsla 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.defaultPropsya está especificado como parcial en TS 2.1+.
Otra buena alternativa (esto es lo que uso) es desestructurar sus propsparámetros y asignar valores predeterminados directamente:
const PageComponent: FunctionComponent<PageProps> = ({foo = "default", bar}) => {
return (
<span>Hello, {foo}, {bar}</span>
);
};
¡Entonces no necesitas defaultPropsnada! Tenga en cuenta que si usted no proporciona defaultPropsen 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 defaultPropsvalores (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 defaultPropses correcto. ¿Puedes publicar ese código?