gpt4 book ai didi

javascript - 如何使某些函数参数可选而没有默认值,而其他函数参数具有默认值?

转载 作者:行者123 更新时间:2023-11-30 11:03:30 25 4
gpt4 key购买 nike

我写了一个函数

function patchItem = (id: string | number, data: object, params: object = {}, cancelToken?: CancelToken, additionalDispatchData: object = {})
{

}

这里我想让params, cancelTokenadditionalDispatchData 参数可选,但是不想给cancelToken一个初始值。

上面的定义在 typescript 中没有显示任何错误并且可以完美编译。

上面的代码编译在下面的js代码中

function patchItem = (id, data, params = {}, cancelToken, additionalDispatchData = {})
{

}

但是在 JS 中,cancelToken 不是可选的,我认为强制参数不能存在于上述两个可选参数之间。

我发现的一种方法是通过将 undefined 作为默认值并删除问号,使 cancelToken 成为可选的。

但我想知道这是否是 tsc 中的错误,它应该将 undefined 作为默认值提供给 cancelToken编译 JS 还是我在这里犯了某种错误?

最佳答案

But here in JS, the cancelToken is not optional and I think a mandatory parameter cannot exist in between the two optional parameters as above.

在 JavaScript 中,所有参数都是可选的。

But I want to know if this is the bug in tsc, that it should have given undefined as the default value to cancelToken in compiled JS or I'm doing some kind of mistake here?

以上都不是。 :-) 默认情况下,JavaScript 函数的所有参数都是可选的,如果未提供默认值,则默认值为 undefined。之间的唯一区别:

function foo(arg = undefined) { }

function foo(arg) { }

fooarity(它期望的参数数量)由 foo.length 表示为 0 在第一种情况下,1 在第二种情况下。这实际上是唯一的区别。

区分 JavaScript/TypeScript 可选参数(和 TypeScript 的函数重载)与函数重载很重要,因为它是在 C# 或 Java 等其他语言中处理的。在 JavaScript 和 TypeScript 中,如果你想让人们忽略不在参数列表末尾的参数,你必须自己处理这些参数。

考虑这个更简单的例子:

function foo(a: string, n?: number, o?: object): void
{
console.log(a, n, o);
}

foo("one", 1, {});
foo("two", {}); // Error: Argument of type '{}' is not assignable to parameter of type 'number'.

( on the playground )

请注意,您不能只省略 n 参数。你必须这样做:

foo("two", undefined, {});

( on the playground )

如果您使用 TypeScript 的函数重载,从类型的 Angular 来看,它允许您省略中间参数,但您的实现必须处理随机接收的实际接收参数值:

function foo(a: string, n: number, o: object): void;
function foo(a: string, o: object): void;
function foo(a: string, n?: any, o?: object): void
{
if (typeof n === "object") {
o = n;
n = undefined;
}
console.log(a, n, o);
}

foo("one", 1, {}); // "one", 1, {}
foo("two", {}); // "two", undefined, {}

( on the playground )

如果您有重载但没有在实现中进行改组,您最终会得到 n 引用对象和 oundefined:

// Incorrect
function foo(a: string, n: number, o: object): void;
function foo(a: string, o: object): void;
function foo(a: string, n?: any, o?: object): void
{
console.log(a, n, o);
}

foo("one", 1, {}); // "one", 1, {}
foo("two", {}); // "two", {}, undefined

( on the playground )

这一切都源于这样一个事实,即静态类型信息在运行时并不存在,而且实际上只有一个函数。

(当您编写 foo("two", { }) 在你的代码中,它知道它只匹配第二个重载签名,但这超出了 TypeScript 设计者目前愿意让它做的事情。:-) )

关于javascript - 如何使某些函数参数可选而没有默认值,而其他函数参数具有默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56611509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com