首页 > 解决方案 > 从未输入字段的打字稿界面

问题描述

给定以下接口,什么是有效的可分配值?

interface A {
  x: number,
  y: never
}

我所期望的是这const a: A = { x: 1 }会起作用,但它错误地说字段y是必需的。我一放在y那里,它就说该值不可分配给never.

我的实际用例是这样的:

interface Context<T extends MyRequest> {
  id: string;
  token: T extends AuthenticateRequest ? string : never;
}

interface AuthenticatedRequest extends MyRequest { ... }

在这里,我无法为它创建一个值,Context<MyRequest>因为它说token缺少。

我目前的解决方法是:

type Context<T extends MyRequest> = {
  id: string;
} & (T extends AuthenticatedRequest ? {
  token: string;
} : {})

但由于显而易见的原因,这看起来很难看......

任何想法我如何正确地做到这一点?

标签: typescripttypescript3.8

解决方案


类型never是空类型的表示。这是什么意思 - 没有属于这种类型的值,这意味着如果你使用它总是会出现编译错误。

您需要的是更高级别的条件类型,请考虑:

type Context<T extends MyRequest> = T extends AuthenticateRequest ? {
  id: string;
  token: string;
} : { id: string };

这种方法消除了设置的undefined负担token。如果token是必需的,那么T extends AuthenticateRequest它是一个字符串,如果不是,则该token字段不存在。


推荐阅读