मैं किसी ऑब्जेक्ट के लिए string कुंजी और मनमानी मानों के साथ एक प्रकार बनाना चाहता हूं। इस प्रकार, मेरा वांछित प्रकार (चलिए इसे Obj कहते हैं) निम्न obj ऑब्जेक्ट के लिए एक प्रकार की त्रुटि का कारण बनना चाहिए क्योंकि इसकी कुंजी प्रकार number है:

const obj: Obj = {
    1: "foo" // I'd expect a TS error here because the key 1 is of type `number` and not `string`
};

हालाँकि, मेरे सभी प्रयासों से कोई TS त्रुटि नहीं होती है! यहाँ मेरे तीन प्रयास हैं:

  1. अंतर्निहित Record प्रकार (जो परोक्ष रूप से in ऑपरेटर का उपयोग करता है):
type Obj = Record<'1', any>;

const obj: Obj = {
    1: "foo" // TS error expected! ❌
};
  1. मैप किया गया प्रकार (Record प्रकार को फिर से बनाने के लिए):
type Obj = { [key: string]: any };

const obj: Obj = {
    1: "foo" // TS error expected! ❌
};
  1. कस्टम Record प्रकार के साथ as के माध्यम से कुंजी रीमैपिंग:
type MyRecord<K extends string, T> = {
    [P in K as string]: T;
};
type Obj = MyRecord<string, any>;

const obj: Obj = {
    1: "foo" // TS error expected! ❌
};
  1. यहां तक ​​​​कि एक शाब्दिक प्रकार '1' का उपयोग करने से कुंजी को '1' होने के लिए लागू नहीं किया जाता है, लेकिन संख्या 1 की अनुमति देता है:
type Obj = Record<'1', any>;

const obj: Obj = {
    1: "foo" // TS error expected! ❌
};

क्या यह सामान्य रूप से संभव है, या जावास्क्रिप्ट ऑब्जेक्ट की कुछ संपत्ति के कारण यह संभव नहीं है?

टीएस खेल का मैदान मेरी कोड की।

0
Andru 7 जिंदा 2022, 14:45

2 जवाब

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

किसी वस्तु को शाब्दिक रूप से परिभाषित करते समय 1 को string ("1") के लिए मजबूर किया जाता है। आप किसी ऑब्जेक्ट को number कुंजियों से परिभाषित नहीं कर सकते:

const obj = {
  prop: 'value',
  1: 'another value',
};

for (const key in obj) {
  console.log(key, typeof key);
}
1
jsejcksn 7 जिंदा 2022, 15:00

टाइपस्क्रिप्ट दस्तावेज़ के keyof पेज से

जावास्क्रिप्ट ऑब्जेक्ट कुंजियों को हमेशा एक स्ट्रिंग के लिए मजबूर किया जाता है, इसलिए obj[0] हमेशा obj["0"] जैसा ही होता है।

तो वास्तव में {1: "foo"} {"1": "foo"} के समान ही है।

1
Cheng Dicky 7 जिंदा 2022, 14:51