TSLint से बचने के लिए कोड को फिर से कैसे लिखें "स्ट्रिंग वाचल्स के माध्यम से ऑब्जेक्ट एक्सेस"


85

मैं टाइपस्क्रिप्ट के लिए बहुत नया हूं और मैं जानना चाहूंगा कि क्या TSLint त्रुटि से बचने के लिए कोड को फिर से लिखने का एक अच्छा तरीका मौजूद है "स्ट्रिंग लिटरल के माध्यम से ऑब्जेक्ट एक्सेस अस्वीकृत है" निम्न कोड में

interface ECType
{
    name: string;
    type: string;
    elementType?: string;
}

export var fields: { [structName: string]: Array<ECType>; } = { };

class ECStruct1 {
    foo: string;
    bar: number;
    baz: boolean;
    qux: number;
    quux: number;
    corge: ECStruct2[];
    grault: ECStruct2;

    constructor() {
        ...
    }
} 

fields['ECStruct1'] = [
    { name: 'foo', type: 'string' },
    { name: 'bar', type: 'int' },
    { name: 'baz', type: 'bool' },
    { name: 'qux', type: 'long' },
    { name: 'quux', type: 'ulong' },
    { name: 'corge', type: 'array', elementType: 'ECStruct2' },
    { name: 'grault', type: 'ECStruct2' }
];

अपडेट : अंत में ऊपर दी गई सामग्री 300 से अधिक ECStructएस के साथ एक स्व-जेनरेट की गई फ़ाइल का हिस्सा होगी , इसलिए मैं ECStruct1इसके मेटा-विवरण (जैसे fields['ECStruct1']) के बाद वर्ग की परिभाषा (जैसे ) रखना चाहूंगा ।


4
मैं टीएस उपयोग नहीं किया है, लेकिन त्रुटि देख रही है और कोड को देखते हुए, मैं कहेंगे आप प्रतिस्थापित करने की आवश्यकता fields['ECStruct1']के साथ fields.ECStruct1। ऑब्जेक्ट प्रॉप्स तक पहुंचने के लिए डॉट नोटेशन का उपयोग करना आमतौर पर स्ट्रिंग शाब्दिक पहुंच से अधिक पसंद किया जाता है।
जेमी डिक्सन

1
धन्यवाद। मैंने पहले ही यह कोशिश की है, लेकिन fields.ECStruct1=टीएस संकलक द्वारा अनुमति नहीं है: त्रुटि TS2339 संपत्ति 'ECStruct1' प्रकार पर मौजूद नहीं है '{[structName: string]: ECType []; } '।
डेनिस कैपेलिन

जवाबों:


152

आपके पास यहां कुछ विकल्प हैं:

बस नियम को निष्क्रिय करें

/* tslint:disable:no-string-literal */
whatever.codeHere()
/* tslint:enable:no-string-literal */

एक स्ट्रिंग शाब्दिक के बजाय एक चर का उपयोग करें

// instead of 
fields['ECStruct1'] = ...
// do something like
let key = 'ECStruct1';
fields[key] = ...

एक स्पष्ट इंटरफ़ेस लिखें / उत्पन्न करें

ऊपर मार्टिलक्स का उत्तर देखें । अनिवार्य रूप से:

interface ECFieldList {
    ECStruct1: ECType[];
}

export var fields:ECFieldList = {
    ECStruct1: [
        ...

इनमें से कोई भी उचित समाधान है, हालांकि मैं # 2 के एक प्रशंसक के रूप में नहीं हूं क्योंकि यह बिना किसी अच्छे कारण के आपके कोड का प्रबंधन कर रहा है। यदि आप कोड वैसे भी उत्पन्न कर रहे हैं, तो शायद fields# 3 में एक प्रकार का निर्माण करना एक अच्छा समाधान है।


48

आप नियम से छुटकारा पा सकते हैं। के लिए देखो tslint.json, कोई प्रॉपर्टी जोड़ते "no-string-literal"साथ false, में rules::

{
"rules": {
    "no-string-literal": false,
    ... other rules ...

41

बस टेम्पलेट शाब्दिक एनोटेशन का उपयोग करें।

fields[`ECStruct1`]

4
बहुत चेतावनी के रूप में यह बदसूरत चाल को पराजित करता है। लेकिन यह एक सरल तरीके से मेरी समस्या को हल करता है ।
लॉसमनोस

आपके कॉन्फिगरेशन के आधार पर, यह एक नई चेतावनी पैदा कर सकता है: `होना चाहिए '(quotmark) tslint (1)
रूबल

6

इस तरह से क्या? मुझे नहीं पता कि आपको अनुक्रमणिका ( [structName: string]: Array<ECType>;) की आवश्यकता है या नहीं।

interface ECType {
    name: string;
    type: string;
    elementType?: string;
}

interface ECFieldList {
    ECStruct1: ECType[];
}

export var fields:ECFieldList = {
    ECStruct1: [
        {name: 'foo', type: 'string'},
        {name: 'bar', type: 'int'},
        {name: 'baz', type: 'bool'},
        {name: 'qux', type: 'long'},
        {name: 'quux', type: 'ulong'},
        {name: 'corge', type: 'array', elementType: 'ECStruct2'},
        {name: 'grault', type: 'ECStruct2'}
    ]
};

मैंने अपने प्रश्नों को संपादित किया और अधिक विवरण जोड़े, इसलिए यह टिप्पणी स्पष्ट होनी चाहिए। मैं एन परिभाषाओं के interfaceसाथ होने से बचना चाहूंगा और फिर जहां मैं हर की वास्तविक परिभाषा लिखूंगा । ECStructexport var fields...ECStruct
डेनिस कैपेलिन

Tslint के लिए आपकी सेटिंग क्या है? मुझे लगता है कि आपने सक्षम किया है no-string-literal(स्ट्रिंग शाब्दिक के माध्यम से ऑब्जेक्ट एक्सेस को रोक दिया है । - npmjs.com/package/tslint )
मार्टिन वेट्टिका

1
हां, अब मेरे पास no-string-literalविश्व स्तर पर सक्षम विकल्प है और केवल उपरोक्त कोड वाली फ़ाइल में मैंने इसे टिप्पणी के साथ अक्षम कर दिया है /* tslint:disable: no-string-literal */
डेनिस कैपेलिन

खैर, fields[variable]स्ट्रिंग्स (यानी fields.ECStruct1) के साथ चर (यानी ) और डॉट सिंटैक्स के साथ ब्रैकेट सिंटैक्स का उपयोग करें और आपको ठीक होना चाहिए।
मार्टिन विसेटिक

5

शायद सबसे अच्छा विकल्प नहीं है, लेकिन उपयोग करना

fields['ECStruct1'.toString()]

काम भी करता है


2
कृपया ऐसा मत करो। लिंटर वहां है क्योंकि प्रोजेक्ट सेट करने वाला व्यक्ति चाहता है कि आप सर्वश्रेष्ठ कोड प्रथाओं का पालन करें, लिंटर नियमों के आसपास हैक न करें।
एंडी

0

ECStruct1 का मान रखने के लिए एक चर को परिभाषित करने का एक सरल तरीका है:

const sampleName = 'ECStruct1';

और फिर, सूचकांक के रूप में चर का उपयोग करके ऑब्जेक्ट तक पहुंच प्राप्त करें:

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