此模式引发TypeScript错误:
类型'(string | number)[]'的参数不能分配给参数 'string []类型的|数字[]'
function foo(value: string | number) {
return bar([value]); // <- TypeScript error
}
function bar(valueList: string[] | number[]) {
..does something...
}
我理解这是因为TypeScript编译器会将其视为包含字符串和数字的数组。
是否有一种类型安全的方法来完成此任务?我只能认为要转换为any[]
,这感觉很糟糕:
function foo(value: string | number) {
const valueList: any[] = [value];
return bar(valueList);
}
答案 0 :(得分:4)
一种执行此操作的方法是declaration merging;为您的函数定义两个单独的接口(请参见function types),然后对其进行单个实现:
interface Foo {
(value: string): void;
}
interface Foo {
(value: number): void;
}
const foo: Foo = function (value) {
return bar([value]);
}
这将使两种类型分开,因为在任何给定时间只能调用其中一个接口。
答案 1 :(得分:2)
这是从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[]) {
}
答案 2 :(得分:1)
另一个答案很好(我赞成),但我个人会选择
return bar([value] as string[] | number[]);
尤其是如果我时间不多。这并不意味着它是错误的或骇人听闻的,您只是暗示有点傻(在这种情况下)打字稿。
P.S。如@paleo所述,这不是完全类型安全的。