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 fooque 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 defaultPropses correcto. ¿Puedes publicar ese código?Respuestas:
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ó
defaultPropsespecí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
fooatributo:Tenga en cuenta que:
foono 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áundefinedporquedefaultPropsproporciona 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+ tratadefaultPropsde una manera similar, ¡lo cual es realmente genial para los usuarios de React!defaultPropsno 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 quedefaultPropscoincida con un subconjunto dePageProps. Más sobre esta advertencia se explica aquí .@types/reactversión16.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:Tenga en cuenta que:
defaultPropsconPartial<>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.strictNullChecksel valor dethis.props.foowill bepossibly undefinedy 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
Partialtipos, 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
defaultPropscomponentes de funciones, pero debe escribir su función en la interfazFunctionComponent(StatelessComponenten la@types/reactversión anterior16.7.2) para que TypeScript conozcadefaultPropsla función:Tenga en cuenta que no tiene que usarlo en
Partial<PageProps>ningún lugar porqueFunctionComponent.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:¡Entonces no necesitas
defaultPropsnada! Tenga en cuenta que si usted no proporcionadefaultPropsen un componente de la función que tendrá prioridad sobre los valores de los parámetros por defecto, porque Reaccionar siempre pasar explícitamente losdefaultPropsvalores (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 elfooaccesorio. Puede hacerlo opcional usandofoo?: stringen su interfaz.public static defaultPropsostatic defaultProps(publices 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 defaultPropssolo porqueprivateypublicno 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/reactque16.4.6. Funciona con16.4.11.fuente
export interface Props { name?: string;}donde nombre es un accesorio opcional ? Sigo recibiendoTS2532 Object is possibly 'undefined'undefinedes una especie de valor predeterminado automático para esos accesorios. ¿Desea poder pasarundefinedcomo 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 dejardefaultPropsque 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 esundefinedcuandodefaultPropsse 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
propsargumento, 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