Conceptos
TypeScript
6 min
slate admite la escritura de un modelo de documento slate (es decir, un conjunto de editor , elemento y texto tipos) si necesitas admitir más de un modelo de documento, consulta la sección modelos de documentos múltiples advertencia debes definir tipospersonalizados al usar typescript o slate mostrará errores de escritura migrando de 0 47 x al migrar de 0 47 x, lee primero la guía a continuación también ten en cuenta estos problemas comunes de migración al referirse a node type , puede ver el error la propiedad 'type' no existe en el tipo 'node' para solucionar esto, necesita agregar código como element iselement(node) && node type === 'paragraph' esto es necesario porque un node puede ser un element o text y text no tiene una propiedad type tenga cuidado al definir el customtype para editor asegúrese de definir el customtype para editor como baseeditor & no debería ser editor & definiendo editor , element y text tipos para definir un element o text tipo personalizado, extienda la customtypes interfaz en el módulo slate de esta manera // this example is for an editor with `reacteditor` and `historyeditor` import { baseeditor } from 'slate' import { reacteditor } from 'slate react' import { historyeditor } from 'slate history' type customtext = { text string; bold boolean; italic boolean } declare module 'slate' { interface customtypes { editor baseeditor & reacteditor & historyeditor element { type 'paragraph'; children customtext\[] } text customtext } } mejores prácticas para elemento y texto tipos si bien puedes definir tipos directamente en el customtypes interfaz, la mejor práctica es definir y exportar cada tipo por separado para que puedas referenciar tipos individuales como un elementopárrafo siguiendo las mejores prácticas, los tipos personalizados podrían verse algo así // this example is for an editor with `reacteditor` and `historyeditor` import { baseeditor } from 'slate' import { reacteditor } from 'slate react' import { historyeditor } from 'slate history' export type customeditor = baseeditor & reacteditor & historyeditor export type paragraphelement = { type 'paragraph' children customtext\[] } export type headingelement = { type 'heading' level number children customtext\[] } export type customelement = paragraphelement | headingelement export type formattedtext = { text string; bold boolean; italic boolean } export type customtext = formattedtext declare module 'slate' { interface customtypes { editor customeditor element customelement text customtext } } en este ejemplo, customtext es igual a formattedtext pero en un editor real, puede haber más tipos de texto como texto en un bloque de código que puede no permitir formato, por ejemplo por qué la definición de tipo es inusual debido a que se pregunta a menudo, esta sección explica por qué la definición de tipo de slate es atípica slate necesita soportar una característica llamada discriminación de tipos que está disponible al usar tipos de unión (por ejemplo, paragraphelement | headingelement ) esto permite a un usuario restringir un tipo si se presenta con código como if (node type === 'paragraph') { } el interior del bloque, restringirá el tipo de nodo a paragraphelement slate también necesita una forma de permitir a los desarrolladores introducir sus tipos personalizados en slate esto se hace a través de la fusión de declaraciones, que es una característica de un interface slate combina un tipo de unión y una interfaz para ofrecer esta característica para más información, consulte https //github com/ianstormtaylor/slate/issues/3725 modelos de documentos múltiples en este momento, slate soporta tipos para un solo modelo de documento a la vez por ejemplo, no puede soportar un editor de texto enriquecido completo para editar documentos mientras también tiene un editor diferente para editar comentarios el soporte de typescript de slate fue diseñado de esta manera porque algún soporte de tipado mejorado era mejor que ninguno el objetivo es soportar tipado para múltiples definiciones de editor en el futuro, pero esto dependerá de la opinión de la comunidad una solución alternativa para soportar múltiples modelos de documentos es crear cada editor en un paquete separado y luego importarlos esto no ha sido probado, pero debería funcionar extendiendo otros tipos actualmente también hay soporte para extender otros tipos, pero estos no han sido probados tan a fondo como los documentados arriba selección rango punto siéntase libre de extender estos tipos, pero extender estos tipos debe considerarse experimental ejemplos de typescript para algunos ejemplos de cómo usar tipos, vea packages/slate react/src/custom types ts en el repositorio de slate
