首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数之间传递参数时的TypeScript错误

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

Stack Overflow用户
提问于 2018-12-06 17:06:06
回答 3查看 447关注 0票数 4

此模式正在引发TypeScript错误:

类型的参数'(string not )[]‘不能分配给'string[] not number[]’类型的参数。

代码语言:javascript
复制
function foo(value: string | number) {
  return bar([value]); // <- TypeScript error
}

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

我理解这是因为TypeScript编译器将把它看作一个包含字符串和数字的数组。

是否有一种类型安全的方法来完成这一任务?我只能想投给感觉不好的any[]

代码语言:javascript
复制
function foo(value: string | number) {
  const valueList: any[] = [value];
  return bar(valueList);
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-12-06 17:15:40

这样做的一种方法是https://www.typescriptlang.org/docs/handbook/declaration-merging.html;为您的函数定义两个独立的接口(参见功能类型),然后是它的一个实现:

代码语言:javascript
复制
interface Foo {
    (value: string): void;
}

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

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

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

票数 4
EN

Stack Overflow用户

发布于 2018-12-06 18:11:58

这是受jonrsharpe的回答启发的,但它没有使用单独的接口,而是使用函数重载。

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

代码语言:javascript
复制
function foo(value: string);
function foo(value: number);
function foo(value: any) {
    return bar([value]);
}

function bar(valueList: number[] | string[]) {
}
票数 2
EN

Stack Overflow用户

发布于 2018-12-06 17:25:33

另一个答案是好的(我投了反对票),但我个人认为

代码语言:javascript
复制
return bar([value] as string[] | number[]);

尤其是如果我赶不上时间的话。这并不意味着它是错误的或恶意的,你只是在暗示一些愚蠢的(在本例中)类型抄本。

正如古柯所提到的,这并不是完全安全的类型。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53656421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档