【问题标题】:Typescript understanding non assignable parameter打字稿理解不可分配的参数
【发布时间】:2019-11-21 11:32:55
【问题描述】:

假设我有以下内容

const client: Client | boolean = await db.connect()
if (client === false) {
  return
}

await start(client)

db.connect() 要么返回客户端(连接成功),要么返回 false(连接失败)。

start 只接受 Client 作为参数:

const start = async (dbClient: Client): Promise<void> => {

如您所见,await start(client) 出现错误:

true 类型的参数 |客户端不可分配给类型客户端

我可以通过在start 中指定Client | boolean 的类型来解决这个问题,并且知道它永远不会是假的,因为它会在start 被调用之前提前返回,并且永远不会是true因为 connect 永远不会返回 true,但是这很奇怪(并且可能会导致进一步的问题)。

这种事情的最佳方法/做法是什么?

我可以返回一个对象,而不仅仅是从 connect 返回 Client

{
  connected: boolean,
  client: client,
}

这里更有意义吗?

【问题讨论】:

    标签: javascript typescript


    【解决方案1】:

    因为您知道它只能是 Client 或 false,您可以将其编码为类型 Client | false。然后,TypeScript 足够聪明,可以计算出如果你排除 false,剩下的就是 Client

    type ClientResult = Client | false;
    const client: ClientResult = await db.connect()
    if (client === false) {
      return
    }
    
    await start(client)
    

    【讨论】:

    • 我试过了,但我得到了Type 'boolean | Client' is not assignable to type 'ClientResult' 使用type ClientResult = Client | false const client: ClientResult = await db.connect()
    • @CarlMarkham,db.connect() 函数的声明是什么?
    • 如果我从 connect 方法中删除返回类型,您的解决方案将有效。所以我现在有async connect() {而不是async connect(): Promise&lt;Client | boolean&gt; {
    【解决方案2】:

    这对我有用,无论是否声明connect()

    interface Client {
        name: string
    }
    
    type ClientResult = Client | false
    
    async function main() {
       const client: ClientResult = await connect(Math.random() > 0.5)
       if (client === false) {
          return
       }
    
        await start(client)
    }
    
    async function start(client: Client) {}
    
    async function connect(i?) {
       return i ? { name: 'John' } : false
    }
    

    你使用的是什么版本的 TypeScript?

    【讨论】:

    • 如果你想走复杂的对象路径,看看npmjs.com/package/ghetto-monad。免责声明:我自己编写了该包以在我参与的项目中强制执行 null 安全性。
    猜你喜欢
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 2021-10-18
    • 2019-06-16
    • 1970-01-01
    • 2023-02-05
    • 2023-01-16
    相关资源
    最近更新 更多