मैं टाइपस्क्रिप्ट के लिए अपेक्षाकृत नया हूं, इसलिए मैं सोच रहा हूं कि मैं या तो कुछ गलत कर रहा हूं या मेरे सेटअप में कुछ गलत है।

मेरा कोड:

import Animated, { Value } from "react-native-reanimated";
import { useRef } from "react";

const useLazyRef = <T>(initializer: () => T) => {
  const ref = useRef<T>();
  if (ref.current === undefined) {
    ref.current = initializer();
  }
  return ref.current;
};

declare type Atomic = string | number | boolean;
type UseValues = {
  <V extends Atomic>(v: V): [Animated.Value<V>];
  <V1 extends Atomic, V2 extends Atomic>(v1: V1, v2: V2): [
    Animated.Value<V1>,
    Animated.Value<V2>
  ];
  <V1 extends Atomic, V2 extends Atomic, V3 extends Atomic>(
    v1: V1,
    v2: V2,
    v3: V3
  ): [Animated.Value<V1>, Animated.Value<V2>, Animated.Value<V3>];
  <V1 extends Atomic, V2 extends Atomic, V3 extends Atomic, V4 extends Atomic>(
    v1: V1,
    v2: V2,
    v3: V3,
    v4: V4
  ): [
    Animated.Value<V1>,
    Animated.Value<V2>,
    Animated.Value<V3>,
    Animated.Value<V4>
  ];
  <
    V1 extends Atomic,
    V2 extends Atomic,
    V3 extends Atomic,
    V4 extends Atomic,
    V5 extends Atomic
  >(
    v1: V1,
    v2: V2,
    v3: V3,
    v4: V4,
    v5: V5
  ): [
    Animated.Value<V1>,
    Animated.Value<V2>,
    Animated.Value<V3>,
    Animated.Value<V4>,
    Animated.Value<V5>
  ];
  <V extends Atomic>(...values: V[]): Animated.Value<V>[];
};

export const useValues = ((<V extends Atomic>(...values: [V, ...V[]]) =>
  useLazyRef(() => values.map((v) => new Value(v)))) as unknown) as UseValues;

const Yup = () => {
  const [one, two, three] = useValues([0, 0, 0]);
  return [one, two, three];
};

export default Yup;

यह लंबा है लेकिन बुनियादी है। कुछ अधिभार हैं लेकिन const [one, two, three] = useValues([0, 0, 0]); तीसरे अधिभार का उपयोग करना चाहिए:

<V1 extends Atomic, V2 extends Atomic, V3 extends Atomic>(
    v1: V1,
    v2: V2,
    v3: V3
  ): [Animated.Value<V1>, Animated.Value<V2>, Animated.Value<V3>];

मुझे दो चेतावनियां मिल रही हैं:

  1. const [one, two, three] दिखाता है कि 'टपल टाइप' [एनिमेटेडवैल्यू]' लंबाई '1' का इंडेक्स '2' पर कोई तत्व नहीं है। ts(2493)` - यह पहले से ही अजीब है। यह दूसरे अधिभार की बात कर रहा है जो एक टपल है और तीसरे अधिभार की उपेक्षा करता है?
  2. useValues([0, 0, 0]) चेतावनी देता है Overload 2 of 6, '(...values: Atomic[]): AnimatedValue<Atomic>[]', gave the following error. Type 'number' is not assignable to type 'string'. ts(2769) - फिर से यह दूसरे अधिभार को संदर्भित करता है

इसलिए मैंने इसके साथ डिबग करने के लिए थोड़ा खेला। मेरा नया कोड:

import Animated from "react-native-reanimated";

declare type Atomic = string | number | boolean;
declare type UseValues = {
  <V1 extends Atomic, V2 extends Atomic, V3 extends Atomic>(
    v1: V1,
    v2: V2,
    v3: V3
  ): [Animated.Value<V1>, Animated.Value<V2>, Animated.Value<V3>];
};
export declare const useValues: UseValues;

const Yup = () => {
  const [one, two, three] = useValues([0, 0, 0]);
  return [one, two, three];
};

export default Yup;

अब मुझे उपयोग के लिए चेतावनी मिल रही है ([0, 0, 0]):

const useValues: <Atomic, Atomic, Atomic>(v1: Atomic, v2: Atomic, v3: Atomic) => [Animated.Value<Atomic>, Animated.Value<Atomic>, Animated.Value<...>]
Expected 3 arguments, but got 1.ts(2554)
testing.ts(7, 5): An argument for 'v2' was not provided.

मैं स्पष्ट रूप से तीन संख्याओं के साथ एक सरणी (जैसा कि अपेक्षित होना चाहिए) पास कर रहा हूं।

अपडेट करें

असाइनमेंट वास्तव में कैसे होता है, यह दर्शाने के लिए मैंने अपना कोड अपडेट किया। भ्रम के बारे में खेद है। यह मेरे लिए भी नया है।

1
Ben 10 जुलाई 2020, 20:15

1 उत्तर

सबसे बढ़िया उत्तर

इससे मुझे लगता है कि useValues एक ऐसा फ़ंक्शन है जो एक सरणी लौटाता है। और आप vars एक, दो, तीन को असाइनमेंट को नष्ट कर रहे हैं।

  const [one, two, three] = useValues([0, 0, 0]);

मैं भी उत्सुक हूं कि क्या होगा यदि आप 3 तर्कों के साथ उपयोग मूल्यों को कॉल करते हैं, उदा। const [one, two, three] = useValues(0, 0, 0);

मैं एक प्रकार घोषित करने के लिए इस वाक्यविन्यास से परिचित नहीं हूँ। पहली नज़र में, ऐसा लगता है कि type UseValues कोई वस्तु है।

declare type UseValues = {
  <V1 extends Atomic, V2 extends Atomic, V3 extends Atomic>(
    v1: V1,
    v2: V2,
    v3: V3
  ): [Animated.Value<V1>, Animated.Value<V2>, Animated.Value<V3>];
};

useValues को असाइनमेंट कहां होता है?

गैर-उत्तर उत्तर के लिए खेद है। यह देखने के लिए कि क्या मैं भी कुछ सीख सकता हूं।

1
joshvito 10 जुलाई 2020, 21:28