जवाबों:
टाइपस्क्रिप्ट 3.5 में, Omit
प्रकार मानक पुस्तकालय में जोड़ा गया था। इसका उपयोग कैसे करें के लिए नीचे दिए गए उदाहरण देखें।
टाइपस्क्रिप्ट 2.8 में, Exclude
प्रकार को मानक पुस्तकालय में जोड़ा गया था, जो एक चूक प्रकार को बस के रूप में लिखने की अनुमति देता है:
type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>
आप Exclude
2.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}
Omit<{a?: string, b?: boolean}, "b">
परिणाम {a: string | undefined}
, जो अभी भी undefined
एक मूल्य के रूप में स्वीकार करता है , लेकिन वैकल्पिक संशोधक को खो देता है a
। :(
Pick
जहां तक मैं देख सकता हूं।
Omit
यहां दी गई है। Stdlib में, यह type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
परिवर्तन है, जबकि मामूली, कुछ बहस का कारण है , इसलिए अंतर के बारे में पता होना चाहिए।
टाइपस्क्रिप्ट 2.8 के साथ, आप नए अंतर्निहित Exclude
प्रकार का उपयोग कर सकते हैं । 2.8 रिलीज नोट्स वास्तव में खंड "पूर्वनिर्धारित सशर्त प्रकार" में यह उल्लेख:
नोट: बहिष्कृत प्रकार यहाँ सुझाए गए डिफ प्रकार का एक उचित कार्यान्वयन है। [...] हमने ओमित प्रकार को शामिल नहीं किया क्योंकि यह तुच्छ रूप में लिखा गया है
Pick<T, Exclude<keyof T, K>>
।
इसे अपने उदाहरण पर लागू करते हुए, XY को इस प्रकार परिभाषित किया जा सकता है:
type XY = Pick<XYZ, Exclude<keyof XYZ, "z">>
मैंने कुछ चरों को घोषित करने और फैलने के लिए फैल ऑपरेटर का उपयोग करने के साथ समाधान पाया है :
interface XYZ {
x: number;
y: number;
z: number;
}
declare var { z, ...xy }: XYZ;
type XY = typeof xy; // { x: number; y: number; }
यह काम करता है, लेकिन मुझे बेहतर समाधान देखकर खुशी होगी।
typeof
टाइपस्क्रिप्ट की अधिक अविकसित विशेषताओं में से एक है।
type Smth = XY & { z: string };
,?
यदि आप लाइब्रेरी का उपयोग करना पसंद करते हैं, तो 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)
पुनश्च: आप वहाँ अन्य उपयोगी सामान के बहुत सारे मिल जाएगा;)
टाइपस्क्रिप्ट 3.5 के रूप में, ओमिट हेल्पर को शामिल किया जाएगा: टाइपस्क्रिप्ट 3.5 आरसी - ओमिट हेल्पर टाइप
आप इसे सीधे उपयोग कर सकते हैं, और अपडेट करते समय आपको ओमिट हेल्पर की अपनी परिभाषा को हटा देना चाहिए।
में टाइपप्रति 3.5+ :
interface TypographyProps {
variant: string
fontSize: number
}
type TypographyPropsMinusVariant = Omit<TypographyProps, "variant">
मुझे यह पसंद है:
interface XYZ {
x: number;
y: number;
z: number;
}
const a:XYZ = {x:1, y:2, z:3};
const { x, y, ...last } = a;
const { z, ...firstTwo} = a;
console.log(firstTwo, last);
Diff<T, U>
(साथT
औरU
चाबी के लिए उपलब्ध प्रकार के रूप में) एक के रूप मेंT
एक के लिए मूल्य के रूप में कुंजी एक ही साथ के प्रकार: 3 प्रकार के एक चौराहे का -keyed सबसेटT
के साथ, प्रकारnever
के लिएU
और साथ प्रकारnever
सभी चाबी के लिए। फिर आप सही मान प्रकार प्राप्त करने के लिए इसे अनुक्रमणिका के माध्यम से पास करते हैं। क्या मैं सही हू?