如何使用命名数组的接口:元素隐式具有“任何”类型,因为索引表达式不是“数字”类型

Posted

技术标签:

【中文标题】如何使用命名数组的接口:元素隐式具有“任何”类型,因为索引表达式不是“数字”类型【英文标题】:How to work with Interfaces of named arrays: Element implicitly has an 'any' type because index expression is not of type 'number' 【发布时间】:2019-10-19 05:30:13 【问题描述】:

在尝试将命名对象分配给 IBindings 接口的空数组时,会出现此错误,但它可以正常编译并且工作正常。

节点 10.16.0,打字稿 3.5.1,VSCode。 已尝试更改为 extends 到 Array 但不起作用。

import  IBindings  from './ioc.interface';

export class ioc 
    private _bindings: IBindings[];

    constructor () 
        this._bindings = [];
    

    bind (namespace: string, closure: Function) 
        if (typeof (closure) !== 'function') 
            throw Error('IoC.bind expects second parameter to be a closure: ' + closure);
        

        console.log(closure);

        // Error is Right here
        this._bindings[namespace] = 
            closure: closure,
            singleton: false,
            cachedValue: null
        

        console.log(`Binding $namespace to ioc container`);
    

export interface IBindings 
    [namespace: string]: 
        closure: Function,
        singleton: boolean,
        cachedValue: Function | null
    

我希望不会给出任何错误,因为它显然是一个需要传递给 IBindings 的字符串,但输出是 Element 隐含地具有“任何”类型,因为索引表达式不是“数字”类型。

【问题讨论】:

【参考方案1】:

IBindings 不是数组而是 JS 对象。所以你班级的前 3 行应该是

    private _bindings: IBindings;

    constructor () 
        this._bindings = ;
    

【讨论】:

我明白了,所以如果不扩展为数组,接口始终是对象 @GustavoFenilli 据我所知,打字稿只允许数字作为数组索引。

以上是关于如何使用命名数组的接口:元素隐式具有“任何”类型,因为索引表达式不是“数字”类型的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript - ts(7053):元素隐式具有“任何”类型,因为“字符串”类型的表达式不能用于索引

元素隐式具有“任何”类型,因为类型的表达式

TypeScript:元素隐式具有“任何”类型,因为“字符串”类型的表达式不能用于索引类型

映射打字稿参数:绑定元素“列”隐式具有“任何”类型

元素隐式具有“任何”类型,因为类型的表达式

元素隐式具有“任何”类型,因为类型“窗口”没有索引签名?