打字稿:参数“错误”隐式具有“任意”类型

时间:2018-06-21 06:53:12

标签: typescript

使用打字稿的第一天,我遇到了逻辑错误?

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逻辑中不了解什么?还是我定义错误?

3 个答案:

答案 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);
}