如何解决联合类型功能“重载”不起作用
我试图通过将函数设置为联合函数类型来“重载”一个函数,以便给定参数的类型设置返回对象中成员data
的类型。但这会引发错误:
type FN1 = (a: string) => {data: string};
type FN2 = (b: number) => {data: number};
const fn: FN1 | FN2 = c => ({data: c});
fn('some string');
^^^^^^^^^^^^^ <= Argument of type 'string' is not assignable to parameter of type 'never'.
fn
的类型显示为
const fn: (arg0: never) => {data: string} | {data: number}
为什么参数类型为never
?还有其他方法使之成为可能吗?
解决方法
这对于泛型来说是一个很好的例子,因为可以从输入类型轻松键入返回类型。
对于任何值:
const fn = <T>(c: T): {data: T} => ({data: c});
仅适用于字符串和数字:
const fn = <T extends string | number>(c: T): {data: T} => ({data: c});
,
为您的需要,我只使用一个通用函数:
function fn1<T>(data: T) {
return { data };
}
当然也可以通过函数重载来解决(注意:这在您的代码sanbox中将不起作用,因为eslint在重新声明该函数时出错,但在typescript中有效,在eslint中是错误):
function fn1(data:string): {data: string};
function fn1(data:number): {data: number};
function fn1(data: any): any {
return {data};
}
fn1("some string");
fn1(1);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。