टाइप चर के लिए खाली वस्तु टाइपस्क्रिप्ट


85

कहो मेरे पास:

type User = {
...
}

मैं एक नया बनाना चाहता हूं userलेकिन इसे एक खाली वस्तु के रूप में सेट करता हूं :

const user: User = {}; // This fails saying property XX is missing
const user: User = {} as any; // This works but I don't want to use any

मैं यह कैसे करु? मैं नहीं चाहता कि चर हो null।


13
या तो आप चाहते हैं userप्रकार की होनी चाहिए User | {}या Partial<User>, या आप को फिर से परिभाषित करने की जरूरत है Userएक खाली वस्तु अनुमति देने के लिए लिखें। अभी, कंपाइलर सही ढंग से आपको बता रहा है कि userए नहीं है User।
— ०२:४३

जवाबों:


175

चेतावनियां

यहां टिप्पणियों के दो योग्य विवरण हैं।

या तो आप उपयोगकर्ता प्रकार का होना चाहते हैं User | {}या Partial<User>, या आप को फिर से परिभाषित करने की जरूरत है Userएक खाली वस्तु अनुमति देने के लिए लिखें। अभी, कंपाइलर सही ढंग से आपको बता रहा है कि उपयोगकर्ता उपयोगकर्ता नहीं है। -jcalz

मुझे नहीं लगता कि इसे एक उचित उत्तर माना जाना चाहिए क्योंकि यह टाइपस्क्रिप्ट के पूरे उद्देश्य को कम करके, प्रकार का एक असंगत उदाहरण बनाता है। इस उदाहरण में, संपत्ति Usernameको अपरिभाषित छोड़ दिया जाता है, जबकि प्रकार एनोटेशन कह रहा है कि यह अपरिभाषित नहीं किया जा सकता है। -Ian Liu Rodrigues

उत्तर

में से एक टाइपप्रति के डिजाइन लक्ष्यों के लिए है "शुद्धता और उत्पादकता के बीच एक संतुलन।" यदि ऐसा करना आपके लिए उत्पादक होगा, तो टाइप किए गए चरों के लिए खाली ऑब्जेक्ट बनाने के लिए टाइप एसेरिज़न्स का उपयोग करें ।

type User = {
    Username: string;
    Email: string;
}

const user01 = {} as User;
const user02 = <User>{};

user01.Email = "foo@bar.com";

यहाँ आपके लिए एक कार्यशील उदाहरण है ।

यहाँ सुझाव के साथ काम करने के प्रकार हैं।


9
धन्यवाद! यह इसे हल करती है! इसे सही उत्तर के रूप में चिह्नित किया जाना चाहिए ...
— कोकोडको

3
मुझे नहीं लगता कि इसे एक उचित उत्तर माना जाना चाहिए क्योंकि यह टाइपस्क्रिप्ट के पूरे उद्देश्य को कम करके, प्रकार का एक असंगत उदाहरण बनाता है। इस उदाहरण में, संपत्ति Usernameको अपरिभाषित छोड़ दिया जाता है, जबकि प्रकार एनोटेशन कह रहा है कि यह अपरिभाषित नहीं किया जा सकता है।
— इयान लियू रोड्रिग्स

2
अच्छी बात @IanLiuRodrigues। मैंने जवाब में कुछ कहावतें जोड़ीं।
— शॉन लुटिन

1
@IanLiuRodrigues टाइपस्क्रिप्ट के लक्ष्यों में से एक उत्पादकता के साथ शुद्धता को संतुलित करना है, इसलिए यह कहना कि यह टाइपस्क्रिप्ट का पूरा उद्देश्य थोड़ा चरम है। github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals
— शॉन लुटिन

21

वास्तव में आप क्या करने की कोशिश कर रहे हैं पर निर्भर करता है। टाइपस्क्रिप्ट में प्रकार दस्तावेज़ हैं, इसलिए आप इस बारे में इरादा दिखाना चाहते हैं कि जब आप टाइप बना रहे हों तो इस चीज़ का उपयोग कैसे किया जाए।

विकल्प 1: यदि उपयोगकर्ताओं के जीवनकाल के दौरान कुछ नहीं बल्कि सभी विशेषताएँ हो सकती हैं

सभी विशेषताओं को वैकल्पिक बनाएं

type User = {
  attr0?: number
  attr1?: string
}

विकल्प 2: यदि उपयोगकर्ता वाले चर शून्य हो सकते हैं

type User = {
...
}
let u1: User = null;

यद्यपि, वास्तव में, यहां अगर बिंदु को उपयोगकर्ता वस्तु घोषित करना है, तो इससे पहले कि यह जाना जा सकता है कि इसे क्या सौंपा जाएगा, आप शायद let u1:Userबिना किसी असाइनमेंट के करना चाहते हैं ।

विकल्प 3: आप जो चाहते हैं

वास्तव में, टाइपस्क्रिप्ट का आधार यह सुनिश्चित करना है कि आप उन मानसिक मॉडल के अनुरूप हैं जिन्हें आप गलतियों से बचने के लिए प्रकारों में रेखांकित करते हैं। यदि आप एक-एक करके चीजों को जोड़ना चाहते हैं, तो यह एक आदत है जो टाइपस्क्रिप्ट आपको करने की कोशिश कर रहा है।

अधिक संभावना है, आप कुछ स्थानीय चर बनाना चाहते हैं, फिर उपयोगकर्ता-युक्त चर को असाइन करें जब यह पूर्ण-उपयोगकर्ता बनने के लिए तैयार हो। इस तरह से आप आंशिक रूप से गठित उपयोगकर्ता के साथ कभी नहीं रहेंगे। वे चीजें स्थूल हैं।

let attr1: number = ...
let attr2: string = ...
let user1: User = {
  attr1: attr1,
  attr2: attr2
}

निश्चित नहीं है कि यह वही है जिसके लिए वह जा रहा है या नहीं, लेकिन यह संभव है कि हम एक अलग तर्क के बारे में बात कर रहे हैं जिसे UserAttributes कहा जाता है या कुछ ऐसा है जो आने वाले मापदंडों को संभालता है। यह स्वीकार्य उपयोगकर्ता ऑब्जेक्ट नहीं हो सकता है, और इस प्रकार इसे अलग से परिभाषित किया जा सकता है।
— 9

यह स्वीकृत उत्तर नहीं होना चाहिए। कृपया नीचे शॉन लुटिन की पोस्ट देखें।
— थरगेंदिआद

1

आप इसे नीचे टाइपस्क्रिप्ट में कर सकते हैं

 const _params = {} as any;

 _params.name ='nazeh abel'

चूंकि टाइपस्क्रिप्ट जावास्क्रिप्ट की तरह व्यवहार नहीं करता है, इसलिए हमें टाइप करना होगा, अन्यथा यह आपको संपत्ति को गतिशील रूप से एक वस्तु को सौंपने की अनुमति नहीं देगा।


0

यदि आप किसी खाली ऑब्जेक्ट को शाब्दिक घोषित करते हैं और फिर बाद में मान निर्दिष्ट करते हैं, तो आप उन मूल्यों को वैकल्पिक मान सकते हैं (हो सकता है या नहीं भी), इसलिए उन्हें प्रश्न चिह्न के साथ वैकल्पिक के रूप में टाइप करें:

type User = {
    Username?: string;
    Email?: string;
}

0

ध्यान दें कि const user = {} as UserTypeकेवल उपयोग करने से इंटैलिजेंस मिलता है लेकिन रनटाइम userखाली वस्तु है {}और अंदर कोई संपत्ति नहीं है। इसका मतलब है कि के बजाय user.Emailदे देंगेundefined""

type UserType = {
    Username: string;
    Email: string;
}

तो, का उपयोग classके साथ constructorवास्तव में डिफ़ॉल्ट गुण के साथ वस्तुओं को बनाने के लिए।

type UserType = {
  Username: string;
  Email: string;
};

class User implements UserType {
  constructor() {
    this.Username = "";
    this.Email = "";
  }

  Username: string;
  Email: string;
}

const myUser = new User();
console.log(myUser); // output: {Username: "", Email: ""}
console.log("val: "+myUser.Email); // output: ""

तुम भी उपयोग कर सकते हैं interfaceके बजायtype

interface UserType {
  Username: string;
  Email: string;
};

... और बाकी कोड समान हैं।


वास्तव में, आप इस constructorभाग को छोड़ भी सकते हैं और इसका उपयोग इस तरह कर सकते हैं:

class User implements UserType {
      Username = ""; // will be added to new obj
      Email: string; // will not be added
}

const myUser = new User();
console.log(myUser); // output: {Username: ""}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.