TypeScript泛型函数返回类型问题 我想通过TypeScript泛型定义函数返回类型。所以R可以是我将定义的任何东西。
TypeScript泛型函数返回类型问题 我想通过TypeScript泛型定义函数返回类型。所以R可以是我将定义的任何东西。,typescript,Typescript,。。。承诺对我来说不是解决办法 错误 错误:(29,9)TS2322:类型“string”不可分配给类型“R”。 “string”可分配给“R”类型的约束,但“R”可以用约束“{}”的不同子类型实例化 import { isString, } from '@redred/helpers'; interface P { as?: 'json' | 'text'; body?: FormData | URLSearchParams | null | string; headers?:
。。。承诺对我来说不是解决办法
错误
错误:(29,9)TS2322:类型“string”不可分配给类型“R”。
“string”可分配给“R”类型的约束,但“R”可以用约束“{}”的不同子类型实例化
import { isString, } from '@redred/helpers';
interface P {
as?: 'json' | 'text';
body?: FormData | URLSearchParams | null | string;
headers?: Array<Array<string>> | Headers | { [name: string]: string };
method?: string;
queries?: { [name: string]: string };
}
async function createRequest<R> (url: URL | string, { as, queries, ...parameters }: P): Promise<R> {
if (isString(url)) {
url = new URL(url);
}
if (queries) {
for (const name in queries) {
url.searchParams.set(name, queries[name]);
}
}
const response = await fetch(url.toString(), parameters);
if (response.ok) {
switch (as) {
case 'json':
return response.json();
case 'text':
return response.text(); // <- Error
default:
return response.json();
}
}
throw new Error('!');
}
export default createRequest;
从'@redred/helpers'导入{isString,};
接口P{
as?:'json'|'text';
body?:FormData | URLSearchParams | null |字符串;
标题?:数组|标题|{[名称:字符串]:字符串};
方法?:字符串;
查询?:{[name:string]:string};
}
异步函数createRequest(url:url | string,{as,querys,…parameters}:P):Promise{
如果(isString(url)){
url=新url(url);
}
如果(查询){
for(查询中的常量名称){
url.searchParams.set(name,查询[name]);
}
}
const response=wait fetch(url.toString(),参数);
if(response.ok){
开关(as){
案例“json”:
返回response.json();
案例“文本”:
return response.text();//我可能会用它来表示与调用方的区别……如果调用方指定“text”
,那么返回类型肯定是Promise
,并且该函数在R
中不再通用
旁白:TypeScript命名约定通常为泛型类型参数保留单字符大写名称(尤其是T
、U
、K
和p
),因此我将您的P
扩展为Params
。此外,标识符as
存在问题,因为它是TypeScript中的一个保留字,可能会混淆IDE或编译器;我将在下面的内容中将as
替换为az
。好的,您的界面是正确的
interface Params {
az?: "json" | "text";
body?: FormData | URLSearchParams | null | string;
headers?: Array<Array<string>> | Headers | { [name: string]: string };
method?: string;
queries?: { [name: string]: string };
}
下面是我们如何使用它来获取文本:
const promiseString = createRequest("str", { az: "text" }); // Promise<string>
请注意,如果指定了R
,则不能请求“text”
:
const notGeneric = createRequest<Dog>("dog", {az: "text"}); // error!
// -----> ~~
// "text" is not assignable to "json" or undefined
const notGeneric=createRequest(“dog”,{az:“text”});//错误!
// -----> ~~
//“文本”不可分配给“json”或未定义
好的,我希望这对你有帮助。祝你好运
您打算如何使用此函数?是否希望有人能够调用createRequest(/*some arguments*/)
并让您的函数返回解析为数字的承诺?您是否尝试使用“wait fetch(url.toStrin(),parameters)'错误是因为,如果将R定义为另一个不是字符串的对象,则此函数可能返回字符串的承诺而不是R的承诺(如果as=='text')所以函数不符合定义。@NicholasTower Yes您的解决方案工作得很好,但我有另一个问题。您能帮助我吗?我正在使用您的解决方案创建请求函数,但它在其他地方不起作用。
interface Dog {
name: string;
age: number;
breed: string;
fleas: boolean;
}
const promiseDog = createRequest<Dog>("dog", {}); // Promise<Dog>
const notGeneric = createRequest<Dog>("dog", {az: "text"}); // error!
// -----> ~~
// "text" is not assignable to "json" or undefined