gpt4 book ai didi

typescript - 具有基于另一个参数的默认参数的函数

转载 作者:行者123 更新时间:2023-12-04 15:32:02 26 4
gpt4 key购买 nike

给定这个 JavaScript 函数:

function foo({ a, b, c = a + b }) {
return c * 2;
}

当我尝试用这样的 typescript 类型对其进行注释时:

function foo({ a, b, c = a + b }: { a?: number, b?: number, c: number }): number {
return c * 2;
}

我收到错误:TS2532 Object is possibly undefined 这是有道理的,因为我还没有告诉它 ab当未指定 c 时,它们不是可选的。

然而,任何对此进行指定的尝试均无效:

  1. 重载 (1):
function foo({ a, b, c = a + b }: { a: number; b: number; c: number }): number;
function foo({ c }: { c: number }): number {
return c * 2;
}

TS2371:参数初始值设定项仅允许在函数或构造函数实现中使用。

  1. 重载 (2):
function foo({ c }: { c: number }): number;
function foo({ a, b, c = a + b }: { a: number; b: number; c: number }): number {
return c * 2;
}

TS2394:此重载签名与其实现签名不兼容。

这对我来说没有意义,我看不出为什么 TypeScript 认为它们不兼容。

  1. 条件
function foo({
a,
b,
c = a + b,
}: {
a: typeof c extends number ? void : number;
b: typeof c extends number ? void : number;
c: typeof a extends number ? void : typeof b extends number ? void : number;
}): number {
return c * 2;
}

TS2502:“a”在其自身的类型注释中被直接或间接引用。TS2502:“c”在其自身的类型注释中被直接或间接引用。

这是有道理的,因为 TypeScript 无法解决递归问题。

有谁知道这个函数怎么会是强类型的?

注意:我非常清楚您可以只更改原型(prototype)本身以具有不同的参数结构,但这会破坏本练习的重点。

最佳答案

这是一个命题,使用联合类型:

type AB_Defined = {
a: number,
b: number,
c?: number,
}

type AB_Nullable = {
a?: never,
b?: never,
c: number,
}

type FunctionParams = AB_Defined | AB_Nullable

// here I need to cheat using a! and b! to tell it cannot be undefined
function foo({ a, b, c = a! + b! }: FunctionParams) {
return c * 2;
}

foo({ a: 3, b: 2 });

关于typescript - 具有基于另一个参数的默认参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61080026/

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