打字稿理解不可分配的参数

时间:2019-07-11 17:22:48

标签: javascript typescript

说我有以下内容

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

await start(client)

db.connect()返回客户端(连接成功时)或返回错误(连接失败)。

start仅接受Client作为参数:

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

您可能会看到,await start(client)出现错误:

  

类型为true的参数|无法分配客户端以键入客户端

我可以通过在Client | boolean中指定start的类型来解决此问题,并且可以放心,它永远不会为假,因为它在调用start之前就返回了,并且永远不会是true,因为connect永远不会返回true,但这会闻到(并可能导致进一步的问题)。

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

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

{
  connected: boolean,
  client: client,
}

在这里更有意义吗?

2 个答案:

答案 0 :(得分:3)

由于您知道它只能是Client或false,因此可以将其编码为Client | false类型。这样,TypeScript就足够聪明了,可以算出如果排除false,剩下的就是Client

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

await start(client)

答案 1 :(得分: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?