No puedo encontrar la manera de establecer valores de propiedad predeterminados para mis componentes usando Typecript.
Este es el código fuente:
class PageState
{
}
export class PageProps
{
foo: string = "bar";
}
export class PageComponent extends React.Component<PageProps, PageState>
{
public render(): JSX.Element
{
return (
<span>Hello, world</span>
);
}
}
Y cuando trato de usar el componente así:
ReactDOM.render(<PageComponent />, document.getElementById("page"));
Recibo un error diciendo foo
que falta la propiedad . Quiero usar el valor predeterminado. También traté de usarlo static defaultProps = ...
dentro del componente, pero no tuvo efecto como sospechaba.
src/typescript/main.tsx(8,17): error TS2324: Property 'foo' is missing in type 'IntrinsicAttributes & IntrinsicClassAttributes<PageComponent> & PageProps & { children?: ReactEle...'.
¿Cómo puedo usar los valores de propiedad predeterminados? Muchos componentes de JS que usa mi compañía dependen de ellos y no usarlos no es una opción.
reactjs
typescript
tsx
Tom
fuente
fuente
static defaultProps
es correcto. ¿Puedes publicar ese código?Respuestas:
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:Que se puede representar y compilar sin pasar un
foo
atributo:Tenga en cuenta que:
foo
no está marcado como opcional (es decirfoo?: string
), aunque no se requiere como un atributo JSX. Marcar como opcional significaría que podría serundefined
, pero en realidad nunca lo seráundefined
porquedefaultProps
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+ tratadefaultProps
de una manera similar, ¡lo cual es realmente genial para los usuarios de React!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 usardefaultProps: Pick<PageProps, "foo">
para asegurarse de quedefaultProps
coincida con un subconjunto dePageProps
. Más sobre esta advertencia se explica aquí .@types/react
versión16.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:Tenga en cuenta que:
defaultProps
conPartial<>
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.strictNullChecks
el valor dethis.props.foo
will bepossibly undefined
y require una aserción no nula (es decirthis.props.foo!
) o un protector de tipo (es decirif (this.props.foo) ...
) para eliminarundefined
. 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ícitodefaultProps
.Antes de TypeScript 2.1
Esto funciona de la misma manera pero no tiene
Partial
tipos, así que simplemente omitaPartial<>
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.Accesorios predeterminados con componentes funcionales
También puede usar
defaultProps
componentes de funciones, pero debe escribir su función en la interfazFunctionComponent
(StatelessComponent
en la@types/react
versión anterior16.7.2
) para que TypeScript conozcadefaultProps
la función:Tenga en cuenta que no tiene que usarlo en
Partial<PageProps>
ningún lugar porqueFunctionComponent.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:¡Entonces no necesitas
defaultProps
nada! Tenga en cuenta que si usted no proporcionadefaultProps
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 losdefaultProps
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.fuente
<PageComponent>
algún lugar sin pasar elfoo
accesorio. Puede hacerlo opcional usandofoo?: string
en su interfaz.public static defaultProps
ostatic defaultProps
(public
es el valor predeterminado) para que todo (compilador y tiempo de ejecución de React) funcione correctamente. Puede funcionar en tiempo de ejecución conprivate static defaultProps
solo porqueprivate
ypublic
no existe en tiempo de ejecución, pero el compilador no funcionaría correctamente.Con Typecript 2.1+, use Parcial <T> en lugar de hacer que las propiedades de su interfaz sean opcionales.
fuente
Con Typecript 3.0 hay una nueva solución para este problema:
Tenga en cuenta que para que esto funcione se necesita una versión más reciente de
@types/react
que16.4.6
. Funciona con16.4.11
.fuente
export interface Props { name?: string;}
donde nombre es un accesorio opcional ? Sigo recibiendoTS2532 Object is possibly 'undefined'
undefined
es una especie de valor predeterminado automático para esos accesorios. ¿Desea poder pasarundefined
como valor explícito a veces, pero tiene otro valor predeterminado? ¿Has probado en suexport interface Props {name: string | undefined;}
lugar? No lo he intentado, solo una idea.?
es lo mismo que agregar|undefined
. Opcionalmente, quiero pasar el accesorio y dejardefaultProps
que se encargue de ese caso. Parece que esto aún no es posible en TS3. Solo usaré lo temidoname!
sintaxis ya que sé que nunca esundefined
cuandodefaultProps
se establecen. ¡Gracias de todos modos!Para aquellos que tienen accesorios opcionales que necesitan valores predeterminados. Crédito aquí :)
fuente
De un comentario de @pamelus sobre la respuesta aceptada:
En realidad, puede usar la herencia de interfaz de Typecript . El código resultante es solo un poco más detallado.
fuente
Para el componente funcional, preferiría mantener el
props
argumento, así que aquí está mi solución:fuente
Componente funcional
En realidad, para el componente funcional, la mejor práctica es la siguiente, creo un componente Spinner de muestra:
fuente