typescript - 从未输入字段的打字稿界面
问题描述
给定以下接口,什么是有效的可分配值?
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;
} : {})
但由于显而易见的原因,这看起来很难看......
任何想法我如何正确地做到这一点?
解决方案
类型never
是空类型的表示。这是什么意思 - 没有属于这种类型的值,这意味着如果你使用它总是会出现编译错误。
您需要的是更高级别的条件类型,请考虑:
type Context<T extends MyRequest> = T extends AuthenticateRequest ? {
id: string;
token: string;
} : { id: string };
这种方法消除了设置的undefined
负担token
。如果token
是必需的,那么T extends AuthenticateRequest
它是一个字符串,如果不是,则该token
字段不存在。
推荐阅读
- python - 撞到块后如何固定我的角色位置?
- python-3.7 - Ray 库抛出“setpgrp failed”错误
- unity3d - 从 Unity 到 Flask 的 POST 请求导致“空”值
- css - 样式引导卡头不起作用
- sql - JPA 存储库中使用 @Query 的多个 SELECT 语句
- reactjs - React Native Picker - 在新闻发布会上
- javascript - 电子邮件边框样式不适用于 javascript 中的表单验证?
- haskell - Haskell 中的错误。请指导我如何解决这个问题
- python - ImportError:无法从“mymodule”导入名称“mylist”
- tensorflow - keras 中全局池化层和(正常)池化层之间的区别