【发布时间】:2020-07-14 18:47:39
【问题描述】:
给定以下接口,什么是有效的可分配值?
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;
} : {})
但由于显而易见的原因,这看起来很丑......
任何想法我如何正确地做到这一点?
【问题讨论】:
-
我想你可能想用
undefined代替never。 -
具有 never 成员的接口与 never 本身一样好,因为该接口的任何值都不可能存在。您可以改用
undefined,但它不会使该属性成为可选的。我认为您当前的解决方法很好,您为什么对此不满意?有什么具体的原因,还是我宁愿它是一个界面? -
这个想法是在定义类型的值时不必设置该字段,同时也使界面看起来非常简单(我将添加更多条件字段,因此它会开始看起来很乱)。虽然据我所知,作为解决方法提到的方法是正确的方法,我没有其他选择......