Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TypeScript泛型函数返回类型问题 我想通过TypeScript泛型定义函数返回类型。所以R可以是我将定义的任何东西。_Typescript - Fatal编程技术网

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