96

我对 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' }
];

更新:最后,上面的内容将是一个超过 300ECStruct秒的自生成文件的一部分,所以我想要类定义(例如ECStruct1),然后是它的元描述(例如fields['ECStruct1'])。

4

7 回答 7

172

你有几个选择:

1)只需禁用规则

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

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

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

3) 编写/生成显式接口

请参阅上面 MartylX 的回答。本质上:

interface ECFieldList {
    ECStruct1: ECType[];
}

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

这些都是合理的解决方案,尽管我不是#2 的粉丝,因为它无缘无故地破坏了你的代码。如果您无论如何都在生成代码,fields那么在#3 中生成类型可能是一个很好的解决方案。

于 2015-10-28T14:53:30.370 回答
54

你可以摆脱规则。在::中查找tslint.json,添加"no-string-literal"带有, 的属性falserules

{
"rules": {
    "no-string-literal": false,
    ... other rules ...
于 2019-02-13T04:50:20.913 回答
53

只需使用模板文字注释。

fields[`ECStruct1`]
于 2019-07-22T18:49:37.460 回答
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'}
    ]
};
于 2015-10-28T11:09:32.453 回答
6

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

fields['ECStruct1'.toString()]

也有效

于 2019-01-02T17:26:15.233 回答
0

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

const sampleName = 'ECStruct1';

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

fields[sampleName] ...
于 2019-08-10T10:52:16.963 回答
0

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

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

如果你看到 type{ [key: string]: string }告诉 TSLint 这个对象接受字符串类型的键和值。类似地,{ [key: string]: any }类型指定键是string类型,值是any类型

于 2021-02-11T12:34:32.270 回答