【问题标题】:WebStorm's TypeScript Lint: Callback Parameter TypeWebStorm 的 TypeScript Lint:回调参数类型
【发布时间】:2018-06-28 13:49:13
【问题描述】:

希望有人可以帮助我,我在试图弄清楚如何让 WebStorm 的 TypeScript Lint 处理特定的回调数据时遇到了一个小问题,这不是可选的。

我有一个要导出的函数:

test(callback: (data: string) => void) {
    callback('Hello from Index');
}

并使用它:

TestClass.test(() => {
      console.log(`This is data from Tester: ${}`); 
})

但是 TypeScript 检查器没有发现我没有输入非可选参数。回调参数是在函数中专门设置的;

callback: (data: string)

我在这里的主要目标是强制每个没有可选参数的函数至少输入参数(不一定在导出的函数中使用确切的名称,但必须使用它,例如:

TestClass.test((result) => {
      console.log(This is data from Tester: ${}); 
})

提前致谢!

【问题讨论】:

  • 这是设计使然。如果你有一个回调参数会接收参数,但回调的实现不使用参数没有问题,只是忽略参数。
  • 有没有什么办法可以强制至少设置回调的实现,当然不一定要使用,比如typescript.json中的任何设置?我对打字稿完全陌生,即使有很好的文档,也很难在谷歌上找到正确的术语,以获得正确的结果。
  • 当然可以,实际上强制使用更简单,我们可以使用"noUnusedParameters": true

标签: typescript callback webstorm lint


【解决方案1】:

这是设计使然。如果你有一个回调参数会接收参数,但是回调的实现不使用参数没有问题,只是忽略参数。

如果没有指定参数,我们可以做一些“聪明”的条件类型来强制编译器给出错误:

type IsValidArg<T> = T extends object ? keyof T extends never ? false : true : true;
type HasArgument<T, TError> =  (T extends (arg: infer U)=> void ? IsValidArg<U> extends true ? {} : TError :TError )

class TestClass {
    static test<T extends (data: string) => void>(callback: T & HasArgument<T, "You need to have an argument to the implementation">): void
    static test(callback: (data: string) => void) {
        callback('Hello from Index');
    }
}

//OK
TestClass.test((data) => {
    console.log(`This is data from Tester: ${data}`);
})
//Type '() => void' is not assignable to type '"You need to have an argument to the implementation"'.
TestClass.test(() => {
    console.log(`This is data from Tester: ${0}`);
})

错误信息并不理想,但足够明确。

您还可以强制调用者使用"noUnusedParameters": true in tsconfig.json 中的参数执行某些操作

【讨论】:

  • 谢谢,noUnusedParamters 正是我想要的!
猜你喜欢
  • 1970-01-01
  • 2021-04-09
  • 2021-01-22
  • 2020-04-27
  • 2021-03-31
  • 2021-11-08
  • 2023-03-30
  • 1970-01-01
  • 2019-12-23
相关资源
最近更新 更多