Typescript: setTimeout - присвоение идентификатора тайм-аута переменной вызывает ошибку TS2323: Тип «Таймер» не может быть назначен типу «число».

Созданный на 7 окт. 2014  ·  24Комментарии  ·  Источник: microsoft/TypeScript

Используя tsc v1.1.0-1, мы получаем ошибку при компиляции:
ошибка TS2323: Тип «Таймер» не может быть назначен типу «Число».

следующий код вызывает ошибку компиляции:

this.sTimeout = setTimeout (() => this.showDelay (), 250);

sTimeout определяется как число (частная переменная).

Question

Самый полезный комментарий

Просто используйте вместо этого window.setTimeout .

Все 24 Комментарий

Выложите, пожалуйста, полный пример. Приведенной на данный момент информации недостаточно, чтобы воспроизвести проблему:

class Foo {
    private sTimeout: number;
    showDelay() { }
    bar() {
        setTimeout(() => this.showDelay(), 250);
    }
}

Не существует встроенного типа с именем Timer поэтому вполне вероятно, что вызываемый вами setTimeout не window.setTimeout .

Надо было привести пример - раньше немного торопились. Ну вот:

class Foo {
    private sTimeout: number; // Storing Timeout ID - to clear it - if needed
    private showDelay() { }
    constructor() {
        this.sTimeout = setTimeout(() => this.showDelay(), 250);
    }
}

Выдает следующую ошибку:

Использование tsc v1.1.0-1
/tests/Foo.ts(5,3): ошибка TS2323: Тип «Таймер» не может быть назначен типу «число».

На данный момент я исправил это, набрав sTimeout для любого.

Это не повторение для меня. Что произойдет, если вы F12 setTimeout ?

Не знаете, что вы имеете в виду под F12? .

"Перейти к определению"

Опять же, нет встроенного типа с именем Timer , поэтому ваш код должен ссылаться на какой-то другой тип. Пожалуйста, попробуйте свой пример в отдельном файле или выясните, откуда в вашем проекте этот Timer . Я предполагаю, что setTimeout не относится к встроенной функции, а скорее к какой-то другой определяемой пользователем функции, которая имеет другое возвращаемое значение.

Пробовал пример сам по себе: похоже, что это вызвано компонентом в моей инструментальной цепочке или другим кодом - извините, что не торопитесь. Спасибо ... Закрыто ...

Для будущих читателей я столкнулся с этой ошибкой из-за определенно типизированных определений node.js. Решение состоит в том, чтобы использовать полное имя типа, которое есть NodeJS.Timer не Timer (что, к сожалению, предлагает транспилятор Typescript, и не работает).

@jdfreder время летит - будущее уже здесь

в любом случае у меня была такая же проблема: error TS2352: Neither type 'Timer' nor type 'number' is assignable to the other. хотя у меня есть неявная ссылка, определенная в верхней части файла, /// <reference path="node_modules/typescript/lib/lib.d.ts" /> прежнему не работает.

Основная проблема заключается в том, что один из наших сторонних пакетов npm (angular2) имеет типы TS + (node ​​и другие), включенные в пакет.

@rixrix (и для всех, кто это находит) У меня была аналогичная проблема, пока я не понял, что не передаю правильные параметры.

Сравните это, для которого требуется второй параметр ms и возвращается NodeJS.Timer :

function setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): NodeJS.Timer;

... и это, что делает второй параметр timeout необязательным и возвращает number :

function setTimeout(handler: any, timeout?: any, ...args: any[]): number;

На основе этих двух функций TS правильно выбирает подходящую перегрузку, поэтому, если вы получите error TS2352: Neither type 'Timer' nor type 'number' is assignable to the other убедитесь, что вы указали тайм-аут!

Привет, @Penryn, спасибо за внимание!

Я думаю, что мой предыдущий комментарий является свидетельством того, что я не дал достаточно подробностей, поскольку я больше не могу вспомнить точные подробности указанного сообщения об ошибке. извиняюсь.

В верхней части моей головы проблема, с которой мы сталкивались раньше, заключалась в том, что мы выполняли инкрементные обновления нашего дополнительного веб-приложения, написанного на Angular2 (альфа-версии). Наша основная кодовая база (ng1 и ng2) написана на TypeScript (с компонентами bower, множеством других типизаций и несколькими пользовательскими типами), и Angular2 в то время также поставлял типизацию, типизацию узлов и т. Д. С нашими типами узлов (устаревшими version) и типов узлов ng2 (и, возможно, других типов), компилятор TS фактически запутается в типах дубликатов. В нашем случае мы могли бы вручную изменить неправильную типизацию, но это слишком много работы, зная, что в какой-то момент нам придется вытащить последнюю версию (и)

Я думаю, что это было решено в последних выпусках Angular2, поскольку нам придется вручную устанавливать необходимые типы.

ура

@RyanCavanaugh имеет number а другой возвращает NodeJS.Timer .

Просто используйте вместо этого window.setTimeout .

Почему NodeJS.Timer требует особого типа? Он все равно просто вернет number верно? Я что-то упускаю?

@cchamberlain Node фактически возвращает весь класс Timer: https://nodejs.org/api/timers.html

Так что не просто number в данном случае.

@Penryn - TIL 👍

Для тех, кому интересно, это происходит потому, что setTimeout в node.js возвращает в браузере нечто иное, чем setTimeout . SetTimeout браузера просто возвращает число; в node.js setTimeout возвращает большой объект Timer.

Итак, причина, по которой вы видите эту проблему, почти наверняка связана с тем, что вы намеревались настроить таргетинг на Интернет, но вы втянули определения узлов.

@johnfn также может быть изоморфным кодом, предназначенным для целевого браузера и узла.

Для других, которые приходят сюда, используя setTimeout или setInterval , используйте window.setTimeout или interval чтобы tsc знала, что вы используете функцию веб-браузера (которая возвращает число ), а не функцию NodeJS (которая возвращает что-то еще).

Чтобы добавить к @AskYous , если у вас есть @types/node в пакетах, используйте window.setInterval чтобы избежать ошибки типа.

Для тех, кто использует @angular с @angular-cli убедитесь, что у вас также есть узел типа на вашем tsconfig.app.json .

Уравнение:

tsconfig.app.json

{
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "outDir": "../out-tsc/app",
    "module": "es6",
    "baseUrl": "",
    "types": ["node"] --> ADD THIS
  },
  "exclude": [
    "test.ts",
    "**/*.spec.ts"
  ]
}

Я нашел это здесь: https://stackoverflow.com/a/43952363/3415716

Возможно, вы импортировали пакет, в котором есть функция с именем setTimeout() .
Просто используйте window.setTimeout вместо setTimeout чтобы решить проблему :)

в типе среды узла NodeJS.Timer use global.setTimeout
а в браузере тип среды number use window.setTimeout

сегодня после установки npm i @types/react @types/react-dom --save-dev

@types\node просочился в node_modules и, таким образом, вызвал ошибку Timer

Как и @ nippur72 , сегодня я столкнулся с этим с react-dom . Я думаю, что самое простое решение - обновить пакет @types , чтобы он не зависел от Node, когда ожидается среда браузера, следовательно: https://github.com/DefinentyTyped/DefinitiTyped/issues/21310#issuecomment -367919251

Была ли эта страница полезной?
0 / 5 - 0 рейтинги