Исправление типов в Typescript - PullRequest
0 голосов
/ 22 октября 2019

У меня есть метод, который использует данные из внешнего API:

public async getStatus(id: string): Promise<APIRes | undefined> {
    try {
        const result = await getRequest(`${this.URL}/endpoint/${id}`)
        const response: APIRes = result.data

        return response
    } catch (err) {
        errorHandler(err)
    }
}

Интерфейс для APIR выглядит следующим образом:

export interface APIRes{
version: string,
status: string,
uuid: string,
time: string

}

Проблемаэто когда я пытаюсь вызвать getStatus из другого метода:

public async getListOfResults(id: string) {
        try {

            const getStatus = await this.getStatus(id)
            if (getStatus.status === 'Queue' || getStatus.status === 'Progr') {
                ...//MORE CODE
            }

            const result = await getRequest(`${this.URL}/endpoint/${id}/result`)

            return result.data
        } catch (err) {
            errorHandler(err)
        }
    }

Я получаю Object is possibly undefined на getStatus.status. Теперь я понимаю, почему это происходит (поскольку метод getStatus может возвращать неопределенное значение), но не знаю, как лучше всего исправить, не добавляя флаг nostrict.

Если я удаляю <| undefined> в типе возврата для getStatus Я получаю

Function lacks ending return statement and return type does not include 'undefined'.ts(2366)`

Если я пытаюсь изменить его с неопределенного на пустое, я все равно получаю сообщение об ошибке getStatus.status

Ответы [ 2 ]

1 голос
/ 22 октября 2019

Такой подход усложняет вам жизнь, чем вам нужно. Если getStatus получает сообщение об ошибке, хотите , чтобы оно разрешилось до undefined? Если это так, то все, что вызывает, должно будет проверить это неопределенное. Почему бы просто не позволить вызывающим абонентам искать выброшенные ошибки? Просто дайте всплыть сообщению об ошибке или выполните обработчик ошибок и перезапустите:

public async getStatus(id: string): Promise<APIRes> {
    try {
        const result = await getRequest(`${this.URL}/endpoint/${id}`)
        const response: APIRes = result.data

        return response
    } catch (err) {
        errorHandler(err)
        throw err;
    }
}

Теперь, это только разрешится до APIRes, и вам не нужно обрабатыватьслучай undefined. Вам просто нужно убедиться, что что-то перехватывает ошибку.

0 голосов
/ 22 октября 2019

Вы видите эту ошибку, скорее всего, потому что вы установили TypeScript в режим strict в вашем tsconfig. Это позволяет другому флагу strictNullChecks, который в свою очередь заставляет типы any и undefined присваиваться только им самим, поскольку вы можете прочитать здесь .

В вашем кодеподпись getStatus public async getStatus(id: string): Promise<APIRes | undefined>, поэтому возвращаемый тип может быть Promise<undefined>, что означает, что вы должны проверить его , а не , чтобы быть неопределенным.

public async getListOfResults(id: string) {
        try {

            const getStatus = await this.getStatus(id)
            if (getStatus // Check if getStatus is NOT undefined before accessing it's properties (so it can only be Promise<APIRes>)
                && (getStatus.status === 'Queue' || getStatus.status === 'Progr')) {
                ...//MORE CODE
            }

            const result = await getRequest(`${this.URL}/endpoint/${id}/result`)

            return result.data
        } catch (err) {
            errorHandler(err)
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...