当noImplicitAny打开时,typescript抛出TS7017错误消息:Element隐式地有一个'any'类型,因为类型'{}'没有索引签名

时间:2018-03-07 08:41:46

标签: typescript

check demo on typescript playground

将选项noImplicitAny设置为true,然后抛出错误。

noImplicitAny

error scrrenshot 如何解决此问题,而不将noImplicitAny设置为false

代码:

function get(params = {}):string {
    let url = '';

    const paramStr = Object.keys(params).reduce((str, key) => {
        const pairStr = `${key}=${params[key]}`;
        return str.indexOf('?') !== -1 ? `&${pairStr}` : `?${pairStr}`;
    }, '');

    url += paramStr;
    console.log(url);

    return url;
}

2 个答案:

答案 0 :(得分:2)

这种情况正在发生,因为params没有与之关联的类型签名。您需要提供一个签名,用于定义字典中keyvalue对的类型。

你可以这样做:

function get(params: { [key: string]: string } = { }):string {

此问题的一个更明显的例子是:

const dict = {};
dict[5] = "five";

在您为dict提供类型签名之前,这将导致错误:

const dict: { [key: number]: string } = {};
dict[5] = "five";

答案 1 :(得分:1)

例如,您可以明确指定类型:

function get(params: { [key: string]: any } = {}): string {
    let url = '';

    const paramStr = Object.keys(params).reduce((str, key) => {
        const pairStr = `${key}=${params[key]}`;
        return str.indexOf('?') !== -1 ? `&${pairStr}` : `?${pairStr}`;
    }, '');

    url += paramStr;
    console.log(url);

    return url;
}

PS:基本上所有类似的问题都可以通过提供具体类型来解决。