ऑब्जेक्ट में बाकी मापदंडों को टाइप करने का तरीका टाइप करें

Nov 26 2020
  function test(data){
      console.log(data)
  }

  test({comments: 'hi', eat: true, sleep: true})

परीक्षण फ़ंक्शन में, मुझे यकीन है कि टिप्पणी तर्क दिखाई देगा, जहां अन्य तर्कों के लिए, गुण गतिशील हो सकते हैं, लेकिन मूल्य बूलियन प्रकार का होगा,

  test({comments: 'hi', drink: true, sleep: true})

इस स्थिति पर विचार करते हुए, मुझे डेटा को सही तरीके से कैसे लिखना चाहिए? मैंने ऐसा कुछ करने की कोशिश की है, लेकिन यह गलत लगता है

function(data: {data: {comments: string, [key: string]: boolean})

जवाब

1 НиколайГольцев Nov 26 2020 at 17:55

मैं आपको कुछ प्रकार के समाधान सुझा सकता हूं:

function test<T extends {
  [key: string]: any;
}>(data: { comments: unknown } & { [key in keyof T]: key extends "comments" ? string : boolean }) {
  const comments = data.comments as string;
  console.log(comments);
  console.log(data.eat);
  console.log(data.sleep);
}

test({comments: "hi"}); // works
test({comments: "hi", eat: true}); // works
test({comments: true}); // doesn't works
test({comments: 5}); // doesn't works
test({comments: "hi", eat: "true"}); // doesn't works
test({comments: "hi", eat: 5}); // doesn't works

यह फ़ंक्शन के शरीर के बाहर अच्छी तरह से टाइप करता है, लेकिन data.commentsसही ढंग से टाइप करने के लिए फ़ंक्शन के शरीर में आपको कुछ संकीर्णता जोड़ना चाहिए।