react native - Definiții TypeScript pentru proprietatea style a Animated.View
Am un component a cărui interfață Props extinde ViewProps din React Native, adică:
export interface Props extends ViewProps {
// Custom props
}
În mod natural, acest lucru extinde proprietatea style. Există o avertizare, folosesc Animated.View și am un stil astfel:
style={{
opacity: animationCharacter.interpolate({
inputRange: [0, 1],
outputRange: [0, 1]
}),
transform: [
{
scale: animationCharacter.interpolate({
inputRange: [0, 1],
outputRange: [1.2, 1]
})
}
]
}}
Cred că apelul interpolate este incompatibil cu tipările de stil din ViewProps, dar nu există un AnimatedViewProps pe care să-l pot extinde.
Există o soluție aici sau va trebui să setez style: any?
Răspuns #1
Începând cu @types/react-native v0.61.9, poți folosi Animated.AnimatedProps:
De exemplu pentru proprietatea style:
interface Props {
style?: Animated.AnimatedProps<StyleProp<ViewStyle>>,
}
Sau pentru a obține toate proprietățile:
export interface Props extends Animated.AnimatedProps<ViewProps> {
// Custom props
}
Răspunsul #2
Am creat un fel de tip care transformă orice stiluri de vizualizare în stiluri animabile.
type MaybeAnimated<T> = T | Animated.Value;
type AnimatedScalar = string | number;
type AnimatedStyles<T> = {
[Key in keyof T]: T[Key] extends AnimatedScalar
? MaybeAnimated<T[Key]>
: T[Key] extends Array<infer U>
? Array<AnimatedStyles<U>>
: AnimatedStyles<T[Key]>
};
type ViewAnimatedStyles = AnimatedStyles<ViewStyle>;
const test: ViewAnimatedStyles = {
transform: [
{
rotateY: new Animated.Value(2),
}
]
}
Primești sugestii automate și valorile animate funcționează.
Limitare: definiția Animated.Value sub capotă este doar o clasă goală, așa că, tehnic, totul se va potrivi cu ea. Deci vei putea să îi atribui o valoare incorectă (de exemplu un șir simplu în loc de un număr)
Citește mai multe despre tipurile inferate și condiționale: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-8.html
