Не уверен, к какому типу принадлежит моя опора в React native typescript

Я пытаюсь внедрить машинописный текст в свой проект, и у меня возникают проблемы с указанием типов опор для моей опоры смахивания. Оба они правильного типа, но при указании этого типа я получаю сообщение об ошибке в строке 72:

style={[styles.container, isFirst && animatedCardStyle]}

В сообщении об ошибке написано: Введите «false | {преобразование: ({[ключ: строка]: значение;} | {поворот: AnimatedInterpolation;}) []; } 'нельзя присвоить типу' false | Значение | AnimatedInterpolation | Зарегистрированный стиль | WithAnimatedObject | WithAnimatedArray ‹...› | только для чтения (false | ... еще 5 ... | undefined) [] | null | неопределенный'. Введите '{преобразование: ({[ключ: строка]: Animated.Value;} | {поворот: Animated.AnimatedInterpolation;}) []; } 'нельзя присвоить типу' false | Значение | AnimatedInterpolation | Зарегистрированный стиль | WithAnimatedObject | WithAnimatedArray ‹...› | только для чтения (false | ... еще 5 ... | undefined) [] | null | неопределенный'. Введите '{преобразование: ({[ключ: строка]: Animated.Value;} | {поворот: Animated.AnimatedInterpolation;}) []; } 'не может быть назначен типу WithAnimatedObject. Типы, возвращаемые функцией transform.pop (), несовместимы между этими типами. Тип '{[ключ: строка]: значение; } | {поворот: AnimatedInterpolation; } | undefined »нельзя присвоить типу« WithAnimatedObject | WithAnimatedObject | WithAnimatedObject | ... еще 10 ... | неопределенный'. Тип '{[ключ: строка]: значение; } 'не может быть назначен типу' WithAnimatedObject | WithAnimatedObject | WithAnimatedObject | ... еще 10 ... | неопределенный'. Свойство 'matrix' отсутствует в типе '{[key: string]: Value; } ', но требуется в типе WithAnimatedObject. index.d.ts (818, 5): здесь объявляется матрица.

Я действительно не понимаю, что это означает, хотя мое приложение работает и работает, я не знаю ошибки, я тоже могу использовать любой тип, и это тоже устраняет эту проблему. Любая помощь была бы замечательной!

import React, {useCallback} from 'react';
    import {LinearGradient} from 'expo-linear-gradient';
    import {Animated, Image, ImageSourcePropType, Text} from 'react-native';
    import Choice from '../Choice';
    import {ACTION_OFFSET} from '../Utils/constants';
    
    import {styles} from './styles';
    
    type Props = {
        name: string,
        source: ImageSourcePropType,
        isFirst: boolean,
        swipe: Animated.AnimatedValueXY,
        tiltSign: Animated.AnimatedValue,
    };
    const Card = ({
                      name,
                      source,
                      isFirst,
                      swipe,
                      tiltSign,
                      ...rest
                  }: Props) => {
        const rotate = Animated.multiply(swipe.x, tiltSign).interpolate({
            inputRange: [-ACTION_OFFSET, 0, ACTION_OFFSET],
            outputRange: ['8deg', '0deg', '-8deg'],
        });
    
        const likeOpacity = swipe.x.interpolate({
            inputRange: [25, ACTION_OFFSET],
            outputRange: [0, 1],
            extrapolate: 'clamp',
        });
    
        const nopeOpacity = swipe.x.interpolate({
            inputRange: [-ACTION_OFFSET, -25],
            outputRange: [1, 0],
            extrapolate: 'clamp',
        });
    
        const animatedCardStyle = {
            transform: [...swipe.getTranslateTransform(), {rotate}],
        };
    
        const renderChoice = useCallback(() => {
            return (
                <>
                    <Animated.View
                        style={[
                            styles.choiceContainer,
                            styles.likeContainer,
                            {opacity: likeOpacity},
                        ]}
                    >
                        <Choice type="like"/>
                    </Animated.View>
                    <Animated.View
                        style={[
                            styles.choiceContainer,
                            styles.nopeContainer,
                            {opacity: nopeOpacity},
                        ]}
                    >
                        <Choice type="nope"/>
                    </Animated.View>
                </>
            );
        }, [likeOpacity, nopeOpacity]);
    
        return (
            <Animated.View
                style={[styles.container, isFirst && animatedCardStyle]}
                {...rest}
            >
                <Image source={source} style={styles.image}/>
                <LinearGradient
                    colors={['transparent', 'rgba(0,0,0,0.9)']}
                    style={styles.gradient}
                />
                <Text style={styles.name}>{name}</Text>
    
                {isFirst && renderChoice()}
            </Animated.View>
        );
    }
    
    export default Card;

person Oliver Darby    schedule 31.01.2021    source источник


Ответы (2)


Наилучший способ, который я нашел, исправить это, - присвоить AnimatedCardStyle тип Animated.Animated, и это устранит ошибку.

import React, {useCallback} from 'react';
import {LinearGradient} from 'expo-linear-gradient';
import {Animated, Image, ImageSourcePropType, Text} from 'react-native';
import Choice from '../Choice';
import {ACTION_OFFSET} from '../Utils/constants';

import {styles} from './styles';

type Props = {
    name: string,
    source: ImageSourcePropType,
    isFirst: boolean,
    swipe: Animated.ValueXY,
    tiltSign: Animated.Value,
};
const Card = ({
                  name,
                  source,
                  isFirst,
                  swipe,
                  tiltSign,
                  ...rest
              }: Props) => {
    const rotate = Animated.multiply(swipe.x, tiltSign).interpolate({
        inputRange: [-ACTION_OFFSET, 0, ACTION_OFFSET],
        outputRange: ['8deg', '0deg', '-8deg'],
    });

    const likeOpacity = swipe.x.interpolate({
        inputRange: [25, ACTION_OFFSET],
        outputRange: [0, 1],
        extrapolate: 'clamp',
    });

    const nopeOpacity = swipe.x.interpolate({
        inputRange: [-ACTION_OFFSET, -25],
        outputRange: [1, 0],
        extrapolate: 'clamp',
    });

    const animatedCardStyle: Animated.Animated = {
        transform: [...swipe.getTranslateTransform(), {rotate}],
    };

    const renderChoice = useCallback(() => {
        return (
            <>
                <Animated.View
                    style={[
                        styles.choiceContainer,
                        styles.likeContainer,
                        {opacity: likeOpacity},
                    ]}
                >
                    <Choice type="like"/>
                </Animated.View>
                <Animated.View
                    style={[
                        styles.choiceContainer,
                        styles.nopeContainer,
                        {opacity: nopeOpacity},
                    ]}
                >
                    <Choice type="nope"/>
                </Animated.View>
            </>
        );
    }, [likeOpacity, nopeOpacity]);

    return (
        <Animated.View
            style={[styles.container, isFirst && animatedCardStyle]}
            {...rest}
        >
            <Image source={source} style={styles.image}/>
            <LinearGradient
                colors={['transparent', 'rgba(0,0,0,0.9)']}
                style={styles.gradient}
            />
            <Text style={styles.name}>{name}</Text>

            {isFirst && renderChoice()}
        </Animated.View>
    );
}

export default Card;
person Oliver Darby    schedule 31.01.2021

Я могу разорвать цепочку ошибок за вас, но, честно говоря, источник действительно глуп, и это не ваша вина.

Ошибка возникает из-за подписи индекса, которую вы видите в этой части сообщения Type '{ [key: string]: Value; }' is not assignable to type 'WithAnimatedObject ...

Свойство transform вашего объекта стиля должно быть array, где каждый объект является одним из эти поддерживаемые типы преобразования. Таким образом, каждый объект должен иметь одно из этих свойств (scaleX, translateX и т. Д.).

Метод getTranslateTransform() возвращает массив с преобразованием для translateX и другого для translateY, что должно быть хорошо, за исключением того, что объявление типа перечисляет возвращаемый тип как { [key: string]: AnimatedValue }[];, что недостаточно конкретно. Следует сказать, что эти ключи являются действительными свойствами преобразования, а не только string.

изменить: предлагается исправление неправильного набора текста.

person Linda Paiste    schedule 02.02.2021