使用打字稿的第一天,我遇到了逻辑错误?
server.ts
interface StopAppCallback {
(err: Error | null): void
}
interface StartAppCallback {
(err: Error | null, result?: Function): void
}
export default (startCb: StartAppCallback): void => {
const stopApp = (stopCb: StopAppCallback): void => {
return stopCb(null)
}
return startCb(null, stopApp)
}
boot.ts
import server from './src/server'
server((err, stopApp) => { //<-- no error
if (err) {
throw err
}
if (typeof stopApp !== 'function') {
throw new Error('required typeof function')
}
stopApp((error) => { //<-- tsc error
if (error) {
throw error
}
})
})
tsc错误:参数“错误”隐式具有“任意”类型
我不明白,接口是用相同的方式定义和设置的。那怎么办? 在设置中关闭 noImplicitAny 和 strict 或添加:any 是愚蠢的。
我在tsc逻辑中不了解什么?还是我定义错误?
答案 0 :(得分:2)
问题出在StartAppCallback
接口上,将result?
定义为Function
。传递给stopApp
的回调变为类型Function
。该类型的函数的参数没有任何确定的类型,因此会出现错误。一个简单的例子:
// this will give the error you're dealing with now
const thing: Function = (arg) => arg
解决方案:将result
定义为实际名称:
interface StartAppCallback {
(err: Error | null, result?: (stopCb: StopAppCallback) => void): void
}
通常,请尽量避免使用Function
类型,因为它会导致代码不安全。
答案 1 :(得分:0)
在代码中添加类型,例如
server((err: String, stopApp) => { //<-- added String type
答案 2 :(得分:0)
问题是您没有在传递的参数中添加传递的参数的类型 箭头功能 例如:
let printing=(message)=>{
console.log(message);
}
这将导致错误
- 错误TS7006:参数'message'隐式具有'any'类型。
正确的方法:
let printing=(message:string )=>{
console.log(message);
}