Тип 'Promise <number>' не может быть назначен типу 'number' - PullRequest
2 голосов
/ 10 марта 2019

Я пытаюсь вернуть номер из обещания: функция getActualId вызывает из chrome.local.storage и возвращает обещание:

function getActualId(){
    return new Promise(function (resolve) {
        chrome.storage.sync.get({
            userId: true
        }, function (userId) {
            resolve(userId.userId);
        });
    });
}

эта функция получает правильное значение, но когда я вызываю его изя продолжаю получать функцию getId, возвращающую Promise<number>, а не обещание.

async function getId(){
    let id:number = 0;
    await getActualId().then( function(userid:number){
        id =  userid;
    })
    return id
}

Как получить реальное значение id из getId, а не promise<number> * * 1014

1 Ответ

3 голосов
/ 10 марта 2019

Вы почти никогда не используете then в функции async. Смысл функций async в том, что вы можете использовать await вместо этого.В вашем случае вы хотите присвоить результат await getActualId() для id:

async function getId(){
    let id:number = await getActualId();
    return id;
}

(Хотя неясно, почему эта функция должна существовать, это просто оболочка вокруг getActualId.)

Однако есть проблема с getActualId, и если мы исправим это, нам не нужна аннотация типа на id в getId: getActualId отсутствует ее аннотация возвращаемого типа, поэтомуон неявно возвращает Promise<any>.Если он возвращает Promise<number>, вам нужно сказать, что:

function getActualId(): Promise<number> {
    return new Promise(function (resolve) {
        chrome.storage.sync.get({
            userId: true
        }, function (userId) {
            resolve(userId.userId);
        });
    });
}

Пример на игровой площадке :

function getActualId(): Promise<number> {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve(Math.floor(Math.random() * 100));
        }, 100);
    });
}
async function getId() {
    let id = await getActualId();
    return id;
}

Если вы наводите id в getId, вы увидите, что TypeScript знает, что это number благодаря сигнатуре getActualId, поэтому нам не нужна аннотация типа, поскольку TypeScript может вывести ее.


¹«почти никогда», я имею в виду искренне почти никогда.Единственный пример, который я могу вспомнить, - это если у вас есть несколько операций, выполняемых параллельно (то есть вы используете Promise.all), и вам нужно выполнить преобразование результата одной из них.Тогда вы могли бы сделать это:

const [first, second, third] = await Promise.all([
   firstOp(),
   secondOp().then(value => value.toUpperCase()),
   thirdOp()
]);

, поскольку использование await на secondOp задержит начало thirdOp (в то время как вышеописанное - нет).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...