Для моего проекта React-Native я пытаюсь получить как можно больше автозаполнения и проверки типов. Одна из проблем заключается в настройке типов используемой библиотеки стилей.
Расширенная таблица стилей выглядит следующим образом:
const styles = createStyles({
variable1: 100,
variable2: "10rem",
header: {
width: "100%",
height: 40,
alignContent: "center",
flex: "$flexAll",
margin: "$gapMD"
}
})
Когда я определяю стили, каждое значение стиля должно быть не только принять его оригинальный тип, но также string
, function
et c.
Когда библиотека завершит обработку таблицы стилей, результатом будет обычная таблица стилей React-Native. Поэтому результат функции должен содержать те же свойства, что и входные данные функции, но свойства должны быть сопоставлены с исходными типами стилей.
Например, flex
должно быть number
, а не number | string | function | etc.
Вот что я получил до сих пор:
import { ImageStyle, TextStyle, ViewStyle } from "react-native"
import EStyleSheet from "react-native-extended-stylesheet"
type Function<K> = () => K
type AllStyles = ImageStyle & TextStyle & ViewStyle
type StyleSet<T> = { [P in keyof T]: AllStyles }
type EValue<T> = T | string & {}
type EVariable<K> = EValue<K> | Function<EValue<K>>
type EStyle<T> = { [P in keyof T]: EVariable<T[P]> }
type EAnyStyle = EStyle<ImageStyle> | EStyle<TextStyle> | EStyle<ViewStyle>
type EStyleSet<T> = { [P in keyof T]: number | string | EAnyStyle | EStyleSet<T> }
export const createStyles = <T>(styles: EStyleSet<T>) =>
EStyleSheet.create(styles) as StyleSet<T>
К сожалению, автозаполнение не работает полностью, и я чувствую, что мои определения становятся слишком сложными. Тип результата также не совсем правильный.
Я действительно надеюсь, что есть мастер TypeScript, который может помочь мне заставить это работать.
I ' Мы установили Песочницу, которую можно использовать для проверки некоторых типов:
https://codesandbox.io/s/typescript-style-mania-h62cv