मुझे यह पता है लेख कि अच्छी तरह से टाइप किया गया JSON आसानी से किसी ऑब्जेक्ट को असाइन किया जा सकता है। उदाहरण के लिए कक्षा के साथ:

export class User {
    id?: number;
    username: string;

    constructor(username: string) {
        this.username = username;
    }
}

अगर मेरे पास JSON स्वरूपित चर jsonUser होता:

const jsonUser = {
    username: bob,
};

तब मैं आसानी से कह सकता था:

user: User = <User>jsonUser;

मेरे पास सवाल यह है कि यदि संभव हो तो मैं एक वर्ग कैसे लिखूं, जो उस वर्ग के गुणों को सीमित करता है। उदाहरण के लिए:

const jsonUser = {
    username: bob,
    email: bob@bob.bob
};

ऊपर परिभाषित मेरी User कक्षा में ईमेल नहीं है। वर्तमान में, यह email को मेरे वेरिएबल प्रकार User के लिए एक संपत्ति के रूप में असाइन करने की अनुमति देता है। मैं इसके बजाय एक त्रुटि फेंकना चाहता हूं या इसे असाइन नहीं करना चाहता हूं।

2
Diesel 27 अक्टूबर 2018, 02:02

1 उत्तर

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

मुझे लगा कि यह संभव नहीं होगा, लेकिन मुझे यह दिलचस्प पोस्ट टाइपस्क्रिप्ट में सटीक प्रकारों के लिए एक फीचर अनुरोध में।

अनिवार्य रूप से आप यह कर सकते हैं:

export class User {
    id?: number;
    username: string;

    constructor(username: string) {
        this.username = username;
    }
}

type Exact<A extends object> = A & {key: keyof A};

const jsonUser = {
    username: 'bob',
};

const jsonUser2 = {
    username: 'bob',
    id: 2
};

const jsonUser3 = {
    username: 'bob',
    email: 'bob@bob.bob'
};

const user: User = jsonUser as Exact<User>; // OK
const user2: User = jsonUser2 as Exact<User>; // OK
const user3: User = jsonUser3 as Exact<User>; // TypeScript error

अंतिम असाइनमेंट मुझे निम्नलिखित टाइपस्क्रिप्ट त्रुटि देता है:

Conversion of type '{ username: string; email: string; }' to type 'Exact<User>' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first.
  Type '{ username: string; email: string; }' is not comparable to type '{ key: "id" | "username"; }'.
    Property 'key' is missing in type '{ username: string; email: string; }'.

सबसे सहज संदेश नहीं है लेकिन यह काम करता है।

समाधान का श्रेय GitHub पर Rafał Łużyński (mindbrave) को जाता है।

1
James Thurley 27 अक्टूबर 2018, 18:23