我们的结构如下所示:
export type LinkRestSource = {
model: string;
rel?: string;
title?: string;
} | {
model?: string;
rel: string;
title?: string;
} | {
model?: string;
rel?: string;
title: string;
};
这几乎等同于说
type LinkRestSource = Partial<{model: string, rel: string, title: string}>
只是这将允许传入一个空对象,而初始类型需要传入一个属性
如何创建像 Part
这样的泛型,但它的行为类似于上面的结构?
jcalz解决方案的更简单版本:
类型 至少一个
所以整个实现变得
js prettyprint-override">type FullLinkRestSource = {
model: string;
rel: string;
title: string;
}
type AtLeastOne<T> = { [K in keyof T]: Pick<T, K> }[keyof T]
type LinkRestSource = AtLeastOne<FullLinkRestSource>
const okay0: LinkRestSource = { model: 'a', rel: 'b', title: 'c' }
const okay1: LinkRestSource = { model: 'a', rel: 'b' }
const okay2: LinkRestSource = { model: 'a' }
const okay3: LinkRestSource = { rel: 'b' }
const okay4: LinkRestSource = { title: 'c' }
const error0: LinkRestSource = {} // missing property
const error1: LinkRestSource = { model: 'a', title: 'c' } // excess property on string literal
这是TS游乐场的链接来试试
如果你知道你想要哪些属性,还有另一个解决方案。
type AtLeast<T, K extends keyof T> = Partial<T> & Pick<T, K>
这也将允许您锁定一个类型的多个密钥,例如。
type LinkRestSource = AtLeast<T, 'model' | 'rel'>
我想我有一个解决方案。您正在寻找一个采用T
类型并生成至少包含T
中一个属性的相关类型的东西。也就是说,它就像<code>Partial
如果是,这里是:
type AtLeastOne<T, U = {[K in keyof T]: Pick<T, K> }> = Partial<T> & U[keyof U]
要分析它:首先,<code>AtLeastOne
嗯,这可能会让人困惑。让我们逐步了解它如何在以下具体类型上运行:
type FullLinkRestSource = {
model: string;
rel: string;
title: string;
}
type LinkRestSource = AtLeastOne<FullLinkRestSource>
那扩展到
type LinkRestSource = AtLeastOne<FullLinkRestSource, {
[K in keyof FullLinkRestSource]: Pick<FullLinkRestSource, K>
}>
或
type LinkRestSource = AtLeastOne<FullLinkRestSource, {
model: Pick<FullLinkRestSource, 'model'>,
rel: Pick<FullLinkRestSource, 'rel'>,
title: Pick<FullLinkRestSource, 'title'>
}>
或
type LinkRestSource = AtLeastOne<FullLinkRestSource, {
model: {model: string},
rel: {rel: string},
title: {title: string}>
}>
或
type LinkRestSource = Partial<FullLinkRestSource> & {
model: {model: string},
rel: {rel: string},
title: {title: string}>
}[keyof {
model: {model: string},
rel: {rel: string},
title: {title: string}>
}]
或
type LinkRestSource = Partial<FullLinkRestSource> & {
model: {model: string},
rel: {rel: string},
title: {title: string}>
}['model' | 'rel' | 'title']
或
type LinkRestSource = Partial<FullLinkRestSource> &
({model: string} | {rel: string} | {title: string})
或
type LinkRestSource = {model?: string, rel?: string, title?: string} &
({model: string} | {rel: string} | {title: string})
或
type LinkRestSource = { model: string, rel?: string, title?: string }
| {model?: string, rel: string, title?: string}
| {model?: string, rel?: string, title: string}
我想,这就是你想要的。
您可以测试它:
const okay0: LinkRestSource = { model: 'a', rel: 'b', title: 'c' }
const okay1: LinkRestSource = { model: 'a', rel: 'b' }
const okay2: LinkRestSource = { model: 'a' }
const okay3: LinkRestSource = { rel: 'b' }
const okay4: LinkRestSource = { title: 'c' }
const error0: LinkRestSource = {} // missing property
const error1: LinkRestSource = { model: 'a', titel: 'c' } // excess property on string literal
那么,这对你有用吗?祝你好运!
问题内容: 当我创建一个jdom文档(Document doc = new Document();)时,默认情况下,我仅在xml标头中看到版本和编码: 如何添加独立属性以获取: 问题答案: 通常,在文档到达JDOM之前,XMLParser会剥离Header。我很确定您的意思是您正在查看JDOM 的 输出 ,该 输出 又添加了XML声明。 您可以通过创建自定义XMLOutput处理器来调整XML声明
使用斜扣。ASP中的AspNetCore。NET Core webapp,我们有如下响应类型: 使用Swashback发出swagger API JSON时,这将变成: 这里的问题是,DateTime是一种值类型,不能为null;但是发出的Swagger API JSON没有将这两个属性标记为必需的。这种行为对于所有其他值类型都是一样的:int、long、byte等,它们都被认为是可选的。 为了完
问题内容: 如何使用in 将 属性设置为表单? 像这样: 我希望属性设置为 日历的 此字段 __ 问题答案: 您可以从树枝模板执行此操作:
装饰器允许我们在指令的host元素上编程设置属性值。 它类似于模板中定义的属性绑定,除了它专门定位到host元素。 对每个变化检测周期检查绑定,因此如果需要,它可以动态地改变。 注意,对于的两个用例,我们传递一个字符串值到我们想要改变的属性。如果我们不向装饰器提供字符串,那么将使用类成员的名称。
问题内容: 我正在尝试标记Javascript 中所需的输入框。 如果该字段最初标记为required: 当用户尝试提交时,将收到验证错误: 但是现在我想通过Javascript 将属性设置为“运行时”: 使用相应的脚本: 除非我现在提交,否则没有验证检查,也没有阻止。 设置HTML5验证布尔属性的正确方法是什么? 您问该属性的值是什么? HTML5验证属性记录为: 4.10.7.3.4 属性 该
我试图按照JavaScript中的要求标记一个输入框。 如果字段最初标记为: 当用户试图提交时,会给出一个验证错误: JSFiddle HTML5验证属性被记录为: 属性是一个布尔属性。当指定时,该元素是必需的。 则属性的值不是空字符串,也不是属性的规范名称: 可能会找到解决办法。