Kan typen aldrig användas för generiska i TypeScript?
Jag har några problem med TypeScript i React.
Jag använde en generisk för att skapa en abstrakt klass relaterad till Axios. Följande ESLint-fel uppstod när jag använde any-typen som en generisk typparameter.
ESLint: Unexpected any. Specify a different type.(@typescript-eslint/no-explicit-any)
ESLint rekommenderade att använda never-typen istället för any i den generiska typen.
Jag kände never som en typ som används för att uttryckligen inte ta emot parametrar eller returnera värden. Är det sant att den kan användas istället för any i generiska typer?
källa
import axios, { AxiosRequestConfig, AxiosInstance, AxiosResponse } from 'axios';
import { stringify } from 'qs';
import { FilterParams } from '@src/interfaces/services/type';
type MethodType = <T = any, R = AxiosResponse<T>, D = any>(
url: string,
data?: D | undefined,
config?: AxiosRequestConfig<D>,
) => Promise<R>;
class AxiosClient {
options: AxiosRequestConfig;
client: AxiosInstance;
get: MethodType;
post: MethodType;
patch: MethodType;
delete: MethodType;
constructor() {
this.options = {
baseURL: process.env.API_ROOT || '/api/',
withCredentials: true,
paramsSerializer: (params: FilterParams) =>
stringify(params, { arrayFormat: 'repeat' }),
};
this.client = axios.create(this.options);
/* method redefinition */
this.get = this.client.get;
this.post = this.client.post;
this.patch = this.client.patch;
this.delete = this.client.delete;
}
}
export default new AxiosClient();
Svar #1
typescript-eslint dokumentation för denna regel.
Ledtråden om regeln föreslår att använda never om du inte bryr dig om vilken typ det är. Subjektivt tycker jag inte att det är fallet här.
any-typer fungerar i Typescript, och om du vill att D bokstavligen ska vara vad som helst, så är det okej. Denna regel finns eftersom any uppenbarligen inte har någon typ-säkerhet, det är att föredra att definiera typer uttryckligen. I det här fallet kan jag se värde i any här, om det passar in i din organisations kodstil, kan du överväga att inaktivera denna regel. Om det inte gör det, bör du överväga vad D kan vara - unknown eller string | object kan fungera lika bra här.
