考虑以下代码:
const timer: number = setTimeout(() => '', 1000);
Typescript引发错误:Type 'Timer' is not assignable to type 'number'.
快速查找告诉我setTimeout
返回NodeJS.Timer
。
但是,如果我正在进行基于浏览器的开发,那么使用NodeJS.Timer
会感到错误。哪种正确的类型定义或返回类型可以使setTimeout
工作而无需借助any
声明?
答案 0 :(得分:13)
最简单的解决方案是允许类型推断起作用,而根本不指定任何类型。如果需要指定类型,请参见浏览器声明和节点声明之间的类型不一致,可以使用ReturnType
来指定变量的类型为setTimeout
的返回类型:
const timer: ReturnType<typeof setTimeout> = setTimeout(() => '', 1000);
或者,也可以使用window.setTimeout
来代替setTimeout
。返回正确的返回类型。
答案 1 :(得分:6)
发生这种情况是因为Typescript将在node_modules/@types
下搜索类型定义
如果在~/node_modules/@types/node/globals.ts
中安装NodeJS类型定义(带有许多npm软件包),而项目在~/Projects/myproject
中,则这些定义将泄漏。
默认情况下,所有可见的“ @types”软件包都包含在您的 汇编。任何封闭文件夹的node_modules / @ types中的软件包 被认为是可见的;具体来说,这意味着 ./node_modules/@types/,../node_modules/@types/, ../../node_modules/@types/,依此类推。
请参阅:https://www.typescriptlang.org/docs/handbook/tsconfig-json.html#types-typeroots-and-types
如果Typescript找到自定义类型定义,则其优先级高于默认类型定义。
解决方案:
"typeRoots":[]
"types": []
答案 2 :(得分:3)
您可以使用window.setTimeout
返回一个number
类型。
let a: number;
a = window.setTimeout(function() {}, 0);
答案 3 :(得分:1)
对于其他有此错误的人,对我有用的是在tsconfig.js文件中添加:
"compilerOptions": {
...
"types": [],
}
答案 4 :(得分:0)
import tkinter as tk
import random
import string
handle = open('dictionary.txt')
words = handle.readlines()
handle.close()
grid_size = 10
words = [ random.choice(words).upper().strip() \
for _ in range(5) ]
print ("The words are:")
print(words)
grid = [ [ '_' for _ in range(grid_size) ] for _ in range(grid_size) ]
orientations = [ 'leftright', 'updown', 'diagonalup', 'diagonaldown' ]
class Label(tk.Label):
def __init__(self, parent, **kwargs):
super().__init__(parent, **kwargs, font=("Courier", 44))
#self.bind('<Button-1>', self.on_click)
#def on_click(self, event):
#w = event.widget
#row, column = w.grid_info().get('row'), w.grid_info().get('column')
#print('coord:{}'.format((row, column)))
#w.destroy()
class App(tk.Tk):
def __init__(self):
super().__init__()
for row in range(grid_size):
for column in range(grid_size):
for word in words:
word_length = len(word)
placed = False
while not placed:
orientation = random.choice(orientations)
if orientation == 'leftright':
step_x = 1
step_y = 0
if orientation == 'updown':
step_x = 0
step_y = 1
if orientation == 'diagonalup':
step_x = 1
step_y = -1
if orientation == 'diagonaldown':
step_x = 1
step_y = 1
x_position = random.randrange(grid_size)
y_position = random.randrange(grid_size)
ending_x = x_position + word_length*step_x
ending_y = y_position + word_length*step_y
if ending_x < 0 or ending_x >= grid_size: continue
if ending_y < 0 or ending_y >= grid_size: continue
failed = False
for i in range(word_length):
character = word[i]
new_position_x = x_position + i*step_x
new_position_y = y_position + i*step_y
character_at_new_position = grid[new_position_x][new_position_y]
if character_at_new_position != '_':
if character_at_new_position == character:
continue
else:
failed = True
break
if failed:
continue
else:
for i in range(word_length):
character = word[i]
new_position_x = x_position + i*step_x
new_position_y = y_position + i*step_y
grid[new_position_x][new_position_y] = character
if ( grid[row][column] == grid[new_position_x][new_position_y] ):
grid[row][column] = grid[new_position_x][new_position_y]
Label(self, text=character).grid(row=row, column=column)
placed = True
#if ( grid[row][column] == '_' ):
#txt = random.SystemRandom().choice(string.ascii_uppercase)
#Label(self, text=txt).grid(row=row, column=column)
if __name__ == '__main__':
App().mainloop()
返回If Target.Cells.CountLarge = 1 Then
If Target.Column = 13 And Target.Value <> "" And Evaluate("COUNTIF(" & Target.Address & ",""*@*.*"")") <> 1 Then
MsgBox "Email address ''" & Target.Value & "'' in " & Target.Address & " is not a valid email address." & _
vbNewLine & "Please enter a valid email address."
Target.ClearContents
Target.Activate
End If
End If
。理想情况下,您希望定义自己的类型以将其与数字区分开(并防止某些window.setTimeout
操作对计时器没有意义)。
number