【发布时间】:2020-01-07 11:20:55
【问题描述】:
我想通过 TypeScript 泛型定义函数返回类型。所以R 可以是我定义的任何东西。
... Promise<R | string> 不是我的解决方案。
错误
错误:(29, 9) TS2322:类型“字符串”不可分配给类型“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;
【问题讨论】:
-
您打算如何使用此功能?您是否希望某人能够调用
createRequest<number>(/*some arguments*/)并让您的函数返回一个解析为数字的承诺? -
你尝试使用'await fetch
(url.toStrin(), paramters)'
-
错误是因为,如果你将 R 定义为另一个不是字符串的东西,这个函数可能会返回一个字符串的承诺而不是 R 的承诺(如果 as=='text')所以该函数不符合定义。
-
@NicholasTower 是的
标签: typescript