当前位置: 首页 > 知识库问答 >
问题:

如何创建需要设置单个属性的类部分

包嘉懿
2023-03-14

我们的结构如下所示:

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 这样的泛型,但它的行为类似于上面的结构?

共有3个答案

彭飞虎
2023-03-14

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游乐场的链接来试试

贲绪
2023-03-14

如果你知道你想要哪些属性,还有另一个解决方案

type AtLeast<T, K extends keyof T> = Partial<T> & Pick<T, K>

这也将允许您锁定一个类型的多个密钥,例如。

type LinkRestSource = AtLeast<T, 'model' | 'rel'>
马业
2023-03-14

我想我有一个解决方案。您正在寻找一个采用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验证属性被记录为: 属性是一个布尔属性。当指定时,该元素是必需的。 则属性的值不是空字符串,也不是属性的规范名称: 可能会找到解决办法。