当前位置: 首页 > 知识库问答 >
问题:

函数之间传递参数时的TypeScript错误

夏侯枫
2023-03-14

此模式抛出TypeScript错误:

类型为“(string | number)[]”的参数不能分配给类型为“string[]| number[]”的参数

function foo(value: string | number) {
  return bar([value]); // <- TypeScript error
}

function bar(valueList: string[] | number[]) {
  ..does something...
}

我理解这是因为TypeScript编译器会将其视为字符串和数字混合的数组。

是否有一种类型安全的方法来实现这一点?我只能想投给任何感觉不好的[]:

function foo(value: string | number) {
  const valueList: any[] = [value];
  return bar(valueList);
}

共有3个答案

裴劲
2023-03-14

另一个答案是好的(我投了反对票),但我个人会同意

return bar([value] as string[] | number[]);

尤其是,如果我时间不够的话。这并不意味着它是错误的或粗俗的,你只是暗示有点愚蠢(在这种情况下)打字稿。

P. S.正如@paleo所提到的,这不是完全类型安全的。

郦磊
2023-03-14

这是从jonrsharpe的答案中得到启发的,但它没有使用单独的接口,而是使用函数重载。

函数重载允许我们为单个实现指定多个签名:https://www.typescriptlang.org/docs/handbook/functions.html#overloads

function foo(value: string);
function foo(value: number);
function foo(value: any) {
    return bar([value]);
}

function bar(valueList: number[] | string[]) {
}
姜德容
2023-03-14

一种方法是声明合并;为函数定义两个单独的接口(请参见函数类型),然后定义函数的单个实现:

interface Foo {
    (value: string): void;
}

interface Foo {
    (value: number): void;
}

const foo: Foo = function (value) {
  return bar([value]);
}

这将使两种类型保持分离,因为在任何给定时间只能调用其中一个接口。

 类似资料:
  • 看两个例子: a = 1 def fun(a): a = 2 fun(a) print a # 1 a = [] def fun(a): a.append(1) fun(a) print a # [1] 所有的变量都可以理解是内存中一个对象的“引用”,或者,也可以看似c中void*的感觉。 通过id来看引用a的内存地址可以比较理解: a = 1 def fun(a): prin

  • 将函数传递给另一个函数的Scala示例缺少传递的函数(时间段)接受参数(x)的情况。 我怎样才能使上述代码工作? 编辑:我在oncepersecond中添加了一个x,以明确目标是传递整数。

  • 我在Snowflake中创建了一个函数,其中包含两个“日期”参数: 我假设我错过了一些简单的东西。是否因为I已将参数声明为“日期”数据类型,而select语句将我的日期值归类为字符串? 提前致谢

  • 问题内容: 我花了过去的几个小时在这里和其他地方进行阅读和实验,但是我并没有真正理解我确信这是一个非常基本的概念:在不同的函数之间传递值(作为变量)。 例如,我将一堆值分配给一个函数中的列表,然后想稍后在另一个函数中使用该列表: 基于对函数参数的作用的理解,我希望这样做如下: 将“列表”初始化为空列表;打电话给main(至少,我知道我没事…) 在defineAList()中,将某些值分配给列表;然

  • 在普通的web开发中,参数传递有这么几种形式: url: /another_page?id=3 表单: <form>...</form> 在vuejs中,不会产生表单的提交(这会引起页面的整体刷新). 所以有两种: url . 同传统语言. vuejs 内部的机制.(无法在url 中体现,可以认为是由js代码隐式实现的) 我们用一个实际的例子说明. 我们之前实现了 "博客列表页",接下来我们要实现

  • 问题内容: 这是一个简单程序的概述 我只是不断获取“未定义全局名称foo” .....有人可以帮我吗?谢谢! 问题答案: 代码段必须是独立的-它们不能进行外部引用。您必须在statement-string或setup-string中定义值: 更好的是,重写代码以不使用全局值。