此模式正在引发TypeScript错误:
类型的参数'(string not )[]‘不能分配给'string[] not number[]’类型的参数。
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);
}发布于 2018-12-06 17:15:40
这样做的一种方法是https://www.typescriptlang.org/docs/handbook/declaration-merging.html;为您的函数定义两个独立的接口(参见功能类型),然后是它的一个实现:
interface Foo {
(value: string): void;
}
interface Foo {
(value: number): void;
}
const foo: Foo = function (value) {
return bar([value]);
}这将使这两种类型保持分离,因为在任何给定的时间都只能调用其中的一个接口。
发布于 2018-12-06 18:11:58
这是受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[]) {
}发布于 2018-12-06 17:25:33
另一个答案是好的(我投了反对票),但我个人认为
return bar([value] as string[] | number[]);尤其是如果我赶不上时间的话。这并不意味着它是错误的或恶意的,你只是在暗示一些愚蠢的(在本例中)类型抄本。
正如古柯所提到的,这并不是完全安全的类型。
https://stackoverflow.com/questions/53656421
复制相似问题