Как использовать Knockout. js с TypeScript без этих ошибок дублирования кода? - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь использовать Knockout. js с TypeScript.

У меня установлены соответствующие пакеты локально с npm (только один проект root npm), как указано в npm ls :

  • @types/knockout@3.4.67
  • knockout@3.5.1
  • wpapi@1.2.1
  • UNMET PEER DEPENDENCY typescript@>= 2.x (я не знаю, что это значит, но возможно это актуально)
  • @types/jquery@3.3.34
  • @types/wpapi@1.1.0

Типы wpapi хорошо работают с реальным пакетом wpapi, но вылет не кажется чтобы работать таким образом.

Иногда я получаю эту ошибку выше в консоли браузера:

Ошибка: не удается найти модуль 'нокаут' из '/.../root- project-directory / subdir1 / subdir2 / js '.

В других случаях я получаю это как вывод tsc:

[17:52:36] Starting compilation in watch mode...

../node_modules/@types/knockout/index.d.ts:1062:13 - error TS2403: Subsequent variable declarations must have the same type.  Variable 'ko' must be of type 'typeof import("/.../root-project-directory/node_modules/knockout/build/types/knockout")', but here has type 'KnockoutStatic'.

1062 declare var ko: KnockoutStatic;
                 ~~

  ../node_modules/knockout/build/types/knockout.d.ts:5:1
    5 export as namespace ko;
      ~~~~~~
    'ko' was also declared here.

[17:52:43] Found 1 error. Watching for file changes.

В main.ts У меня есть :

import ko = require("knockout");
import * as WPAPI from "wpapi";

или

import * as ko from "knockout";
import * as WPAPI from "wpapi";

В последнем случае я получаю следующие ошибки:

[18:12:15] Starting compilation in watch mode...

wp-content/themes/custom-theme/assets/ts/main.ts:1:21 - error TS2307: Cannot find module 'knockout'.

1 import * as ko from "knockout";
                      ~~~~~~~~~~

wp-content/themes/custom-theme/assets/ts/main.ts:39:19 - error TS2304: Cannot find name 'KnockoutObservable'.

39         language: KnockoutObservable<string>;
                     ~~~~~~~~~~~~~~~~~~

wp-content/themes/custom-theme/assets/ts/main.ts:40:15 - error TS2304: Cannot find name 'KnockoutObservable'.

40         slug: KnockoutObservable<string>;
                 ~~~~~~~~~~~~~~~~~~

wp-content/themes/custom-theme/assets/ts/main.ts:41:26 - error TS2304: Cannot find name 'KnockoutObservable'.

41         renderedContent: KnockoutObservable<string>;
                            ~~~~~~~~~~~~~~~~~~

[18:12:21] Found 4 errors. Watching for file changes.

и включаю нокаут, используя тег <script>. Я использую VS Code.

Пожалуйста, помогите мне решить эту проблему.

Еще один соответствующий открытый вопрос здесь .

Спасибо.

Обновление 1

Если я удаляю @types/knockout, используя npm uninstall @types/knockout, я получаю эти ошибки при запуске cd html; tsc:

[13:48:34] Starting compilation in watch mode...

wp-content/themes/custom-theme/assets/ts/main.ts:40:19 - error TS2304: Cannot find name 'KnockoutObservable'.

40         language: KnockoutObservable<string>;
                     ~~~~~~~~~~~~~~~~~~

wp-content/themes/custom-theme/assets/ts/main.ts:41:15 - error TS2304: Cannot find name 'KnockoutObservable'.

41         slug: KnockoutObservable<string>;
                 ~~~~~~~~~~~~~~~~~~

wp-content/themes/custom-theme/assets/ts/main.ts:42:26 - error TS2304: Cannot find name 'KnockoutObservable'.

42         renderedContent: KnockoutObservable<string>;
                            ~~~~~~~~~~~~~~~~~~

wp-content/themes/custom-theme/assets/ts/main.ts:50:29 - error TS2304: Cannot find name 'ko'.

50             this.language = ko.observable(language);
                               ~~

wp-content/themes/custom-theme/assets/ts/main.ts:51:25 - error TS2304: Cannot find name 'ko'.

51             this.slug = ko.observable(slug);
                           ~~

wp-content/themes/custom-theme/assets/ts/main.ts:52:36 - error TS2304: Cannot find name 'ko'.

52             this.renderedContent = ko.observable("");
                                      ~~

wp-content/themes/custom-theme/assets/ts/main.ts:97:9 - error TS2304: Cannot find name 'ko'.

97         ko.applyBindings(new PageViewModel(null, "home"));
           ~~

[13:48:40] Found 7 errors. Watching for file changes.

Перед удалением @types/knockout все работало хорошо, поэтому я делаю не знаю, в чем была настоящая проблема. Возможно, проблема была решена, потому что я закомментировал import * as ko from "knockout"; с начала main.ts. Поэтому я снова устанавливаю пакет @types/knockout.

Обновление 2

Этот является моим связанным вопросом.

1 Ответ

1 голос
/ 04 апреля 2020

Knockout@3.5.1 поставляется со своими собственными типами, поэтому нет необходимости устанавливать пакет @types/knockout. Начиная с 3.5.0 R C, Knockout JS уже связывает свои собственные наборы - установка наборов из DefiniteTyped приведет к дублированию набора.

Решение будет просто удалить @types/knockout, т.е. npm uninstall @types/knockout.

...