मेरे पास एक फ़ंक्शन logNumbers है जो एक शब्दकोश को स्वीकार करता है जहां सभी कुंजियां तार होती हैं और सभी मान संख्याएं होती हैं। मैं logNumbers को एक सख्त इंटरफ़ेस से संबंधित ऑब्जेक्ट के साथ कॉल करना चाहता हूं लेकिन फिर भी उन शर्तों को पूरा करता है।

interface NumberDictionary {
  [key: string]: number;
}

interface StatisticsResult {
  mean: number;
  mode: number;
  median: number;
}

function logNumbers(numDict: NumberDictionary) { ... }

const results: StatisticsResult = {
  mean: 1,
  mode: 2,
  median: 2,
};

// 
// Error:
//   Argument of type 'StatisticsResult' is not assignable to parameter of type 'NumberDictionary'.
//   Index signature is missing in type 'StatisticsResult'.
//
logNumbers(results);

मैं चाहता हूं कि StatisticsResult वही रहे और logNumbers के हस्ताक्षर को किसी तरह संशोधित करें। क्या इसे करने का कोई तरीका है? शायद मैं टाइपस्क्रिप्ट को संकेत दे सकता हूं कि numDict में logNumbers के भीतर कोई नई कुंजी नहीं जोड़ी जाएगी?

टाइपस्क्रिप्ट खेल के मैदान में प्रजनन

3
Will Howell 17 जिंदा 2019, 18:55

1 उत्तर

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

यदि आपका लक्ष्य केवल संख्या गुणों वाले किसी ऑब्जेक्ट तक फ़ंक्शन को प्रतिबंधित करना है, तो आप केवल संख्याओं के साथ एक रिकॉर्ड होने के लिए विवश एक सामान्य प्रकार पैरामीटर का उपयोग कर सकते हैं।

  interface StatisticsResult {
    mean: number;
    mode: number;
    median: number;
  }

  function logNumbers<T extends Record<keyof T, number>>(num: T) {
    // Log the numbers as a table or something
  }

  const results: StatisticsResult = {
    mean: 1,
    mode: 2,
    median: 2,
  };

  //ok
  logNumbers(results);
3
Titian Cernicova-Dragomir 17 जिंदा 2019, 19:09