प्रकार से संपत्ति को छोड़ दें


158

मैं किसी एक गुण को प्रकार से बाहर करना चाहूंगा। मैं उसे कैसे कर सकता हूँ?

उदाहरण के लिए मेरे पास है

interface XYZ {
  x: number;
  y: number;
  z: number;
}

और मैं zपाने के लिए संपत्ति को बाहर करना चाहता हूं

type XY = { x: number, y: number };

जवाबों:


335

3.5 या उससे अधिक टाइपस्क्रिप्ट के संस्करणों के लिए

टाइपस्क्रिप्ट 3.5 में, Omitप्रकार मानक पुस्तकालय में जोड़ा गया था। इसका उपयोग कैसे करें के लिए नीचे दिए गए उदाहरण देखें।

3.5 से नीचे टाइपस्क्रिप्ट के संस्करणों के लिए

टाइपस्क्रिप्ट 2.8 में, Excludeप्रकार को मानक पुस्तकालय में जोड़ा गया था, जो एक चूक प्रकार को बस के रूप में लिखने की अनुमति देता है:

type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>

2.8 से नीचे टाइपस्क्रिप्ट के संस्करणों के लिए

आप Exclude2.8 से नीचे के संस्करणों में प्रकार का उपयोग नहीं कर सकते हैं, लेकिन आप ऊपर के समान परिभाषा का उपयोग करने के लिए इसके लिए एक प्रतिस्थापन बना सकते हैं। हालांकि, यह प्रतिस्थापन केवल स्ट्रिंग प्रकारों के लिए काम करेगा, इसलिए यह उतना शक्तिशाली नहीं है Exclude

// Functionally the same as Exclude, but for strings only.
type Diff<T extends string, U extends string> = ({[P in T]: P } & {[P in U]: never } & { [x: string]: never })[T]
type Omit<T, K extends keyof T> = Pick<T, Diff<keyof T, K>>

और उपयोग में उस प्रकार का एक उदाहरण:

interface Test {
    a: string;
    b: number;
    c: boolean;
}

// Omit a single property:
type OmitA = Omit<Test, "a">; // Equivalent to: {b: number, c: boolean}

// Or, to omit multiple properties:
type OmitAB = Omit<Test, "a"|"b">; // Equivalent to: {c: boolean}

महान! आप की घोषणा कर रहे हैं Diff<T, U>(साथ Tऔर Uचाबी के लिए उपलब्ध प्रकार के रूप में) एक के रूप में Tएक के लिए मूल्य के रूप में कुंजी एक ही साथ के प्रकार: 3 प्रकार के एक चौराहे का -keyed सबसेट Tके साथ, प्रकार neverके लिए Uऔर साथ प्रकार neverसभी चाबी के लिए। फिर आप सही मान प्रकार प्राप्त करने के लिए इसे अनुक्रमणिका के माध्यम से पास करते हैं। क्या मैं सही हू?
क्वर्टी

5
हां! लेकिन इसमें एक खामी है। उदाहरण के लिए, Omit<{a?: string, b?: boolean}, "b">परिणाम {a: string | undefined}, जो अभी भी undefinedएक मूल्य के रूप में स्वीकार करता है , लेकिन वैकल्पिक संशोधक को खो देता है a। :(
क्राइस

यह दुखद है। दिलचस्प है कि घोषणा और प्रसार के साथ यह तरीका वैकल्पिक संशोधक है ... क्या इसे रखने का कोई और तरीका है?
Qwertiy

1
@ क्वर्टी यह काम करता है! बहुत धन्यवाद! मैंने पोस्ट को एडिट किया। लेकिन मुझे आश्चर्य है कि क्या अंतर था, क्योंकि जो कुछ भी था, मैं उस प्रकार की परिभाषा के समान था Pickजहां तक ​​मैं देख सकता हूं।
23

3
टीएस 3.5 के लिए ध्यान दें, मानक पुस्तकालय की परिभाषा Omitयहां दी गई है। Stdlib में, यह type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;परिवर्तन है, जबकि मामूली, कुछ बहस का कारण है , इसलिए अंतर के बारे में पता होना चाहिए।
CRice

41

टाइपस्क्रिप्ट 2.8 के साथ, आप नए अंतर्निहित Excludeप्रकार का उपयोग कर सकते हैं । 2.8 रिलीज नोट्स वास्तव में खंड "पूर्वनिर्धारित सशर्त प्रकार" में यह उल्लेख:

नोट: बहिष्कृत प्रकार यहाँ सुझाए गए डिफ प्रकार का एक उचित कार्यान्वयन है। [...] हमने ओमित प्रकार को शामिल नहीं किया क्योंकि यह तुच्छ रूप में लिखा गया है Pick<T, Exclude<keyof T, K>>

इसे अपने उदाहरण पर लागू करते हुए, XY को इस प्रकार परिभाषित किया जा सकता है:

type XY = Pick<XYZ, Exclude<keyof XYZ, "z">>

19

मैंने कुछ चरों को घोषित करने और फैलने के लिए फैल ऑपरेटर का उपयोग करने के साथ समाधान पाया है :

interface XYZ {
  x: number;
  y: number;
  z: number;
}

declare var { z, ...xy }: XYZ;

type XY = typeof xy; // { x: number; y: number; }

यह काम करता है, लेकिन मुझे बेहतर समाधान देखकर खुशी होगी।


3
यह एक महान पूर्व 2.8 समाधान है। typeofटाइपस्क्रिप्ट की अधिक अविकसित विशेषताओं में से एक है।
जेसन होएगर

1
चतुर, मुझे यह पसंद है :)! (पूर्व 2.8 के लिए)
मैक्सिमे 1992

मैं आपके परिणाम में टाइप स्ट्रिंग के साथ z कैसे जोड़ सकता हूं
user602291

@ user602291 type Smth = XY & { z: string };,?
क्वर्टी

1
यह टाइपस्क्रिप्ट के पुराने संस्करण के लिए एकदम सही है। मुझे 2.3 के लिए काम करने का अकस्मात उत्तर नहीं मिला, फिर भी इसने बहुत काम किया।
k0pernikus

6

यदि आप लाइब्रेरी का उपयोग करना पसंद करते हैं, तो ts-Essentials का उपयोग करें ।

import { Omit } from "ts-essentials";

type ComplexObject = {
  simple: number;
  nested: {
    a: string;
    array: [{ bar: number }];
  };
};

type SimplifiedComplexObject = Omit<ComplexObject, "nested">;

// Result:
// {
//  simple: number
// }

// if you want to Omit multiple properties just use union type:
type SimplifiedComplexObject = Omit<ComplexObject, "nested" | "simple">;

// Result:
// { } (empty type)

पुनश्च: आप वहाँ अन्य उपयोगी सामान के बहुत सारे मिल जाएगा;)


5

टाइपस्क्रिप्ट 3.5

टाइपस्क्रिप्ट 3.5 के रूप में, ओमिट हेल्पर को शामिल किया जाएगा: टाइपस्क्रिप्ट 3.5 आरसी - ओमिट हेल्पर टाइप

आप इसे सीधे उपयोग कर सकते हैं, और अपडेट करते समय आपको ओमिट हेल्पर की अपनी परिभाषा को हटा देना चाहिए।



हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.