Dlaczego moja instancja mówi, że nie istnieje na HTTP?

Używam mojej instancji, aby powrócić, który typ Axios Call zamierzam zrobić - Get / Post i tak dalej.

    constructor(baseURL: string, headers = {}, config = {}, interceptors = null, timeout = 8000) {
    this.instance = axios.create({
        headers,
        timeout,
        baseURL,
        ...config,
    });

    if (interceptors) {
        interceptors.hook(this.instance);
    }
}
2
Elias Marco Lip 16 październik 2020, 17:19

1 odpowiedź

Najlepsza odpowiedź

Właściwość "instancja" nie istnieje na "http"

Podczas tworzenia klasy w maszynach musisz zadeklarować wszystkie właściwości klasy i ich typy.

import axios, {AxiosInstance, AxiosRequestConfig} from "axios";

class Http {
    public instance: AxiosInstance;

    /* ...  */
}

Możesz przejść do tego wymogu, gdy używasz konstruktora ciała, aby ustawić argumenty konstruktora jako zmienne instancji. Ale w tym przypadku tworzysz nieruchomość w konstruktorze, więc musisz go zadeklarować na najwyższym poziomie klasy.

Obiekt jest prawdopodobnie "null"

Dodatkowo musisz zadeklarować typy dla niektórych argumentów konstruktorów, ponieważ nie można ich odpowiednio wywnioskować. Zasadniczo maszynki przyjmuje rodzaj domyślnej wartości i zakłada, że typ domyślnym jest typem argumentu. Więc przyjmuje się tak timeout = 8000

Ale interceptors = null będzie powodować problemy, ponieważ maszynopis nie wie, co ma być typ interceptors}, gdy nie jest null. Faktycznie przypisuje typ interceptors jako null, więc nawet po sprawdzeniu, czy istnieje, że nadal pojawi się błąd Object is possibly 'null'.

Prawdopodobnie masz już typ tego obiektu gdzieś w bazie kodu, ale na podstawie tego kodu fragmentnego samego musi mieć nieruchomość hook, która może wziąć instancję:

interface Interceptors {
    hook( instance: AxiosInstance ): void;
}

W celu użycia null jako wartość domyślna musimy powiedzieć, że ta zmienna może być albo, aka {x1}}.

W przypadku nagłówkach i konfiguracji muszą być wpisane do czegoś, co AXIOS może zaakceptować. {{X0}. typy W przypadku konfiguracji po prostu użyjemy typu AxiosRequestConfig importowaliśmy z AXIOS. Moglibyśmy uzyskać fantazję i Omit Właściwości, które nadejdziemy, ale to niepotrzebne, ponieważ są już opcjonalne.

Prawidłowo wpisany konstruktor może wyglądać coś w rodzaju

    constructor(
        baseURL: string,
        headers: Record<string, any> = {},
        config: AxiosRequestConfig = {},
        interceptors: Interceptors | null = null,
        timeout: number = 8000
    ) {

Link

1
Linda Paiste 16 październik 2020, 17:56