如何重写代码以避免TSLint"通过字符串文字对象访问"

时间:2015-10-28 09:18:53

标签: typescript tslint

我对TypeScript很陌生,我想知道是否存在重写代码以避免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 s的自生成文件的一部分,因此我希望获得类定义(例如{ {1}})后跟其元描述(例如ECStruct1)。

7 个答案:

答案 0 :(得分:62)

你有几个选择:

只需停用规则

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

使用变量而不是字符串文字

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

编写/生成显式界面

MartylX's answer above。基本上:

interface ECFieldList {
    ECStruct1: ECType[];
}

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

其中任何一个都是合理的解决方案,虽然我并不像#2的粉丝那么多,因为它没有任何理由破坏你的代码。如果您仍在生成代码,那么为#{1}}生成类型就像在#3中一样,这是一个很好的解决方案。

答案 1 :(得分:5)

您可以摆脱规则。寻找tslint.json,并在"no-string-literal"中添加带有false的属性rules ::

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

答案 2 :(得分:2)

这样怎么样?我不知道您是否需要索引器([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'}
    ]
};

答案 3 :(得分:2)

可能不是最好的选择,但使用

fields['ECStruct1'.toString()]

也可以

答案 4 :(得分:0)

只需使用模板文字注释即可。

CSV

答案 5 :(得分:0)

一种简单的方法是定义一个变量以保存ECStruct1的值:

const sampleName = 'ECStruct1';

,然后通过使用变量作为索引来访问对象:

fields[sampleName] ...

答案 6 :(得分:0)

我遇到了同样的错误。但我试图利用 type 对象的 HeadersRequest 并且它对我有用。以下是我设法解决该问题的方法。

const objToAdd: { [key: string]: string } = {};
objToAdd.type = 'typeToAdd';
objToAdd.key = 'keyToAdd';
objToAdd.value = 'valueToAdd';

如果您看到类型 { [key: string]: string },则告诉 TSLint 该对象采用字符串类型的键和值。 类似地,{ [key: string]: any } 类型指定键是 string 类型,值是 any 类型