我对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
的自生成文件的一部分,所以我希望在类定义(例如ECStruct1
)之后加上它的元描述(例如fields['ECStruct1']
)。
这里有几个选项:
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,因为它毫无理由地破坏了你的代码。如果您无论如何都在生成代码,那么像#3中那样为fields
生成类型可能是一个不错的解决方案。
您可以摆脱该规则。查找tslint.json
,在rules
::中用false
添加属性"no-string-literal"
{
"rules": {
"no-string-literal": false,
... other rules ...
只需使用模板文字注释。
fields[`ECStruct1`]
这种方式怎么样?我不知道你是否需要索引器([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'}
]
};
可能不是最好的选择,但使用
fields['ECStruct1'.toString()]
也工作
一个简单的方法是定义一个变量来保存ECStruct1:的值
const sampleName = 'ECStruct1';
然后,使用变量作为索引来访问对象:
fields[sampleName] ...
我也遇到过同样的错误。但我尝试使用Request
对象的Headers
的type
,它对我有效。下面是我如何解决这个问题的。
const objToAdd: { [key: string]: string } = {};
objToAdd.type = 'typeToAdd';
objToAdd.key = 'keyToAdd';
objToAdd.value = 'valueToAdd';
如果您看到类型{ [key: string]: string }
,则它会告诉TSLint该对象采用字符串类型的键和值。类似地,{ [key: string]: any }
类型指定键为string
类型,的值为any
类型