存在诸如Overloads
for 之类的东西class
?我创建了与 createRequest.ts 相关的先前问题,该函数应该没有错误。我想为函数中的class Data
类似泛型定义相同的泛型createRequest
。
错误
错误:(31, 52) TS2345:“RequestParameters”类型的参数不可分配给“RequestParameters & { as?: "json" | 类型的参数 不明确的; }'。类型 'RequestParameters' 不能分配给类型 '{ as?: "json" | 不明确的; }'。'as' 的属性类型是不兼容的。输入'"json" | “文本” | undefined' 不能分配给类型 '"json" | 不明确的'。类型 '"text"' 不能分配给类型 '"json" | 不明确的'。
数据.tsx
import * as React from 'react';
import createRequest, { RequestParameters, } from '../../createRequest';
interface P<R> {
children: (children: { createRequest: Data<R>['createRequest'] } & S<R>) => React.ReactNode;
parameters: RequestParameters;
url: Parameters<typeof createRequest>[0];
}
interface S<R> {
error: Error | null;
response: R | null;
}
class Data<R> extends React.Component<P<R>, S<R>> {
async componentDidMount () {
await this.createRequest();
}
state = { error: null, response: null, };
createRequest = async (): Promise<void> => {
this.setState(() => ({ error: null, response: null, }));
try {
const { parameters, url, } = this.props;
const response = await createRequest<R>(url, parameters); // <-- Error
this.onResponse(response);
} catch (error) {
this.onError(error);
}
};
onError (error: Error): void {
this.setState(() => ({ error, }));
throw error;
}
onResponse (response: R): void {
this.setState(() => ({ response, }));
}
render () {
const { children, } = this.props;
return children({ createRequest: this.createRequest, ...this.state, });
}
}
export default Data;
创建请求文件
import { isString, } from '@redred/helpers';
export interface RequestParameters {
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 (url: URL | string, parameters: RequestParameters & { as: 'text' }): Promise<string>;
async function createRequest<R> (url: URL | string, parameters: RequestParameters & { as?: 'json' }): Promise<R>;
async function createRequest<R> (url: URL | string, parameters: RequestParameters): Promise<R | string> {
if (isString(url)) {
url = new URL(url);
}
if (parameters.queries) {
for (const name in parameters.queries) {
url.searchParams.set(name, parameters.queries[name]);
}
}
const response = await fetch(url.toString(), parameters);
if (response.ok) {
switch (parameters.as) {
case 'json':
return response.json();
case 'text':
return response.text();
default:
return response.json();
}
}
throw new Error('!');
}
export default createRequest;