Элемент неявно имеет тип 'any', потому что тип 'typeof globalThis' не имеет подписи индекса - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь получить следующий код для компиляции и запуска в TypeScript.

Я не уверен, почему funcMap вызывает у меня проблемы. Если я попробую это в чистом JavaScript, мне скажут, что this.funcMap.k1 не является функцией?

const obj = {

  foo: function () { console.log("foo") },
  bar: function () { console.log("bar") },

  funcMap: {
    k1: this.foo,
    k2: this.bar
  },

  dump: function () {
    this.funcMap.k1();    // --> foo
    this.funcMap["k2"](); // --> bar
  }

}

obj.dump();

Сообщение об ошибке:

main.ts:7:14 - error TS7017: Element implicitly an 'any' type 
because type 'typeof globalThis' no index signature.

7     k1: this.foo,
               ~~~

main.ts:8:14 - error TS7017: Element implicitly an 'any' type 
because type 'typeof globalThis' no index signature.

8     k2: this.bar
               ~~~

Ответы [ 2 ]

2 голосов
/ 20 апреля 2020

Это потому, что ключевое слово this внутри объекта не является самим этим объектом, это глобальный контекст, такой как window в браузерах или global в node.js.

this будет указывать на объект внутри функции, но не как свойство объекта.

Чтобы исправить ваш код, я бы переместил эти функции в отдельные константы:

const foo = function () { console.log("foo") }
const bar = function () { console.log("bar") }

const obj = {
  foo, // shortcut for foo: foo
  bar,

  funcMap: {
    k1: foo,
    k2: bar
  },

  dump: function () {
    this.funcMap.k1();    // --> foo
    this.funcMap["k2"](); // --> bar
  }

}

obj.dump();
0 голосов
/ 21 апреля 2020

В итоге я выбрал следующее решение. Он должен был превратить funcMap в функцию, возвращающую объект сопоставления.

«user2541867» также предоставил ответ, однако, возможно, вы не можете или не хотите перемещать функцию в глобальное пространство.

const obj = {

  foo: function () { console.log("foo") },
  bar: function () { console.log("bar") },

  funcMap: function () {
    return {
      k1: this.foo,
      k2: this.bar
    }
  },

  dump: function () {
    const mapped = this.funcMap();
    mapped.k1();    // --> foo
    mapped["k2"](); // --> bar
  }

}

obj.dump();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...