【问题标题】:Typescript function returning two different objects打字稿函数返回两个不同的对象
【发布时间】:2020-01-12 12:35:53
【问题描述】:

我对 TypeScript 还很陌生,我正在尝试弄清楚如何让这个东西正常工作。 我做了一些广泛的谷歌搜索,但最终求助于 Stack Overflow。

我有一个根据某些条件返回用户对象或错误对象的函数。 当我调用这个函数时,我似乎无法处理不同的情况而不会出现跟随错误。

Property 'error' does not exist on type 'User | Error'.
  Property 'error' does not exist on type 'User'.ts(2339)

这里有一些代码来证明我的目标,错误发生在main() 函数中的>>。

interface User {
    email: string;
    username: string;
}

interface Error {
    error: string;
    code: number;
}

async function get_user_info(user_id: number): Promise<User | Error> {
    const result = await db.get_user(user_id); // let's say this returns false if no user found..
    if (result) {
        const user: User = {
            email: result.email,
            username: result.username
        }
        return user;
    } else {
        const err: Error = {
            error: "Failed to fetch user.",
            code: 583
        }
        return err;
    }
}

async function main() {
    const res = await get_user_info(42);
>>  if (res.error) {
        // handle this...
    } else {
        // continue onwards...
    }
}

我是否遗漏了什么,或者这种事情是不可能的?

【问题讨论】:

  • 不是一个答案,但是为什么你返回一个包含错误而不是错误承诺的已解决承诺?
  • 我试图避免为非致命事件引发错误以提高性能。我认为最好正常返回并根据返回值处理非致命错误。

标签: node.js typescript types tsconfig ts-node


【解决方案1】:

应用类型保护,通过检查 error 属性是否存在来测试它是 User 还是 Error 对象:

async function main() {

    const res = await get_user_info(42);

    if ('error' in res) {
         if (res.error) {
             // handle this...
         }
    } else {
        // continue onwards...
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-24
    • 2019-07-06
    • 2022-01-14
    • 1970-01-01
    • 2019-02-13
    • 2019-10-12
    • 1970-01-01
    • 2021-12-17
    相关资源
    最近更新 更多