TypeScript: ввод httprequest с различными типами возврата - PullRequest
0 голосов
/ 15 ноября 2018

Я довольно хорошо знаком с Javascript, но у меня есть некоторые проблемы с воссозданием некоторых шаблонов, которые я использую в TypeScript, потому что я не уверен, как печатать функции, которые могут иметь различные поля JSON.Например, я пытался написать простую функцию http-запроса, которую я мог бы использовать:

async function requestTest (options: https.RequestOptions) {
    const prom = new Promise((resolve, reject) => {
        https.request(options, (res) => {
            res.on('data', (d) => {
                if (d.status == 200) {
                    resolve(d)
                }
                reject('failed')
            })
        })
    return await prom

Однако, если я действительно хочу использовать эту функцию, скажем, запросить базу данных и получить результат, где "поле data »в ответе будет содержать данные известной структуры, для которой у меня объявлен интерфейс:

const getData = (opts): ISomeStructure => {
    return requestTest(opts)
}

Я получаю ошибку типа:

Type 'Promise<{}>' is not assignable to type 'ISomeStructure'.

Как объявить типы таким образом, чтобы сообщить машинописи, что в этом случае я ожидаю, что в ответе http будет ключ, содержащий ISomeStructure объект JSON?

1 Ответ

0 голосов
/ 15 ноября 2018

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

Асинхронная проблема заключается в том, что вы возвращаете requestTest(opts), в то время как вы заявляете, что ваша функция вернет ISomeStructure,Поскольку requestTest повторяет Promise, вы должны вернуть Promis<ISomeStructure> из getData, поскольку данные, возвращенные requestTest, не будут сразу же доступны для прямого возврата.

Вторая проблема заключается в том, что выдолжен позволять указывать тип возврата запроса в качестве параметра типа в requestTest, чтобы ваша функция могла использоваться для любого возвращаемого типа.

function requestTest<T>(options: https.RequestOptions) {
    return new Promise<T>((resolve, reject) => {
        https.request(options, (res) => {
            res.on('data', (d) => {
                if (d.status == 200) {
                    resolve(d)
                }
                reject('failed')
            })
        })
    });
}

const getData = (opts: https.RequestOptions): Promise<ISomeStructure> => {
    return requestTest<ISomeStructure>(opts)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...