Используя tsc v1.1.0-1, мы получаем ошибку при компиляции:
ошибка TS2323: Тип «Таймер» не может быть назначен типу «Число».
следующий код вызывает ошибку компиляции:
this.sTimeout = setTimeout (() => this.showDelay (), 250);
sTimeout определяется как число (частная переменная).
Выложите, пожалуйста, полный пример. Приведенной на данный момент информации недостаточно, чтобы воспроизвести проблему:
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
Самый полезный комментарий
Просто используйте вместо этого
window.setTimeout
.