typescript 跳过对未使用参数的类型检查

fcy6dtqo  于 2023-01-10  发布在  TypeScript
关注(0)|答案(3)|浏览(210)

当我编译我的typescript项目时,我使用noImplicitAny选项,这样我就不会忘记指定变量和参数的类型。
然而,有时候你会有一些不用的参数,例如:

jQuery.ajaxTransport("+*", function (options: JQueryAjaxSettings) {
  return {
    abort: function (_, callback: JQueryCallback) {

我对abort函数的第一个参数不感兴趣,所以我忽略它,将其命名为_。
在TypeScript中,这是正确的方法吗?我在指南中找不到它。我怀疑这不是正确的方法,因为我只能命名一个参数_。
Typescript引发以下错误:
错误TS7006:参数“_”隐式具有“any”类型。
我可以直接输入_:any,但对于我不使用的参数来说,这似乎有点过头了。

yhxst69z

yhxst69z1#

我也遇到了同样的问题。使用say express和routing,你通常只想要res参数。

router.get('/', function (req, res) { res.end('Bye.'); });

您使用_的想法在这里很有效,但我也发现这样做也很有效。

function (_1, _2, _3, onlyThis) { console.log(onlyThis); }

这似乎更好,因为我认为只使用'_'可能会使使用lodash/下划线有点混乱,而且它也使它明显是您感兴趣的第四个参数。
更新:我已经很久没有发布这个答案了,在评论中我得到了一些误解。所以我想澄清一下。
使用下划线技巧在Typescript中仍然非常有用。就像我在最初的答案中提到的,假设你使用express并执行app.get('/', (req, res) => {,你会得到一个'req' is declared but its value is never read的警告,但是如果你执行-〉app.get('/', (_req, res) => {,警告就会消失。你不应该得到error TS7006: Parameter 'req' implicitly has an 'any' type.错误,因为@types/express应该隐式地输入这个参数。
请注意第二个答案,使用{}作为参数,可能看起来很酷,但是它相当慢,所以我个人会小心使用内部紧循环。

icnyk63a

icnyk63a2#

我可能会迟到,但我被其他解决方案卡住了,这一个对我来说一直有效:

function ({}={}, {}={}, {}={}, onlyThis) { console.log(onlyThis); }

比较

在使用_0_1、...解决方案时,我遇到了一些与scooped函数有关的困难,例如:

function parent(_0, _1, _2) {
  function child(_0, _1, _2) {
    // TypeScript crying about shadowed variables
  }
}

但是对于空的对象它工作得很好:

function parent({}, {}, {}) {
  function child({}, {}, {}) {
    // :-)
  }
}

即使参数的类型如下:

function parent({}: number, {}: string, {}: any) {
  function child({}: number, {}: string, {}: any) {
    // :-) x2
  }
}

编辑:
正如这里所写的,如果给定的参数是undefinednull,设置默认值可以避免抛出错误。

function parent({}={}, {}={}, {}={}) {
  function child({}={}, {}={}, {}={}) {
    // :-)
  }
}
xggvc2p6

xggvc2p63#

这是绝对邪恶的,但你可以使用这个:

function fn(...[,,,param]){
  console.log(param)
}
fn(2,3,4,5) //prints(5)

相关问题