Typescript 自定义承诺函数中的泛型返回类型
我已经使用泛型创建了一个可重用函数,它可以获取数据,以便每个响应都匹配指定的类型。如何为该函数实现一个通用返回类型,在调用该函数时可以指定该类型?(代码块2) 我得到的错误是: 类型为“(value:Test)=>void”的参数不能分配给类型为“(value:unknown)=>void | PromiseLike”的参数。Typescript 自定义承诺函数中的泛型返回类型,typescript,promise,typescript-generics,Typescript,Promise,Typescript Generics,我已经使用泛型创建了一个可重用函数,它可以获取数据,以便每个响应都匹配指定的类型。如何为该函数实现一个通用返回类型,在调用该函数时可以指定该类型?(代码块2) 我得到的错误是: 类型为“(value:Test)=>void”的参数不能分配给类型为“(value:unknown)=>void | PromiseLike”的参数。 参数“value”和“value”的类型不兼容。 类型“未知”不可分配给类型“测试”。ts(2345) 你可能想让承诺a承诺根本不是一种类型;相反,它会关闭该类型值的类型
参数“value”和“value”的类型不兼容。 类型“未知”不可分配给类型“测试”。ts(2345)
你可能想让
承诺
a承诺根本不是一种类型;相反,它会关闭该类型值的类型检查。这将允许您将值
回调参数注释为测试
,而无需编译器抱怨
这类似于通过is返回的Body
对象从发出的JavaScript返回承诺的方式,并且(有一个真正的test.com
,因此我不会将其用于测试,仅供参考)不会看到两个调用之间的差异,因此,它无法知道第一个调用需要类型为number
的id
属性,而第二个调用需要类型为string
的id
属性。因此,其中至少有一个可能会导致运行时错误
有更多类型安全的方法来编写这样的东西,但它们将涉及到类型保护,在运行时实际检查您的假设。但是,如果您只想手动断言响应的类型并继续,那么,any
可能是一个不错的选择
感谢您的快速回复,但遗憾的是,我的linting不允许任何类型:{如果您真的认为这是我就linting问题与项目经理对质的唯一方法。这不是“唯一的方法”,而是与TypeScript的库一致的处理JSON类型输出的方法。JSON.parse()
返回any
;(wait fetch(“”)。json()
返回承诺。就我个人而言,这一点不太好。如果允许您使用any
(如axios.get()
)但不编写any
,那么可能吗?
const fetcher = (url: string) => {
return new Promise(async (resolve, reject) => {
try {
const res = await axios.get(url, {
headers: { Accept: "application/json" },
});
resolve(res.data);
} catch (e) {
Alert.alert(e.message);
reject();
}
});
};
interface Test {
id: number;
title: string;
}
fetcher("test.com").then((value: Test) => {
// Do something with value
});
const fetcher = (url: string) => {
return new Promise<any>(async (resolve, reject) => { // <-- change on this line
try {
const res = await axios.get(url, {
headers: { Accept: "application/json" },
});
resolve(res.data);
} catch (e) {
Alert.alert(e.message);
reject();
}
});
};
fetcher("example.com").then((value: Test) => {
console.log(value.id.toFixed());
});
interface Other {
id: string;
}
fetcher("example.com").then((value: Other) => {
console.log(value.id.toUpperCase());
});