Typescript 一种类型脚本接口,允许两个可选键中的一个或无,但不能同时允许两个

Typescript 一种类型脚本接口,允许两个可选键中的一个或无,但不能同时允许两个,typescript,Typescript,有没有办法定义一个Typescript接口,该接口允许对象中的两个可选键中的一个,或者没有一个,但不是两个 以下是我试图实现的一个简化示例: const example1={foo:'some string'}//应通过-只能有“foo:string” 常数example2={bar:42};//应通过-只能有“条:编号” 常量example3={};//应该通过-foo和bar都是可选的 const example4={foo:'some string',bar:42};//应抛出类型脚本错误

有没有办法定义一个Typescript
接口
,该接口允许对象中的两个可选键中的一个,或者没有一个,但不是两个

以下是我试图实现的一个简化示例:

const example1={foo:'some string'}//应通过-只能有“foo:string”
常数example2={bar:42};//应通过-只能有“条:编号”
常量example3={};//应该通过-foo和bar都是可选的
const example4={foo:'some string',bar:42};//应抛出类型脚本错误-不能同时具有foo和bar;

PS.解决方案应该是一个
接口
,而不是
类型
,因为在我的用例中,它扩展了另一个
接口
类型
接口
是同构的,您可以连接这两个结构。下面按类型union和intersection实现,还添加了示例接口以显示其工作良好,
&
相当于
扩展
。考虑:

interface OtherInterface {
    field?: string
}
type Example = ({
    foo: string
    bar?: never
} | {
    foo?: never
    bar: number
} | {
    [K in any]: never
}) & OtherInterface

const example1: Example = { foo: 'some string' }; // ok

const example2: Example = { bar: 42 }; // ok

const example3: Example = {}; // ok

const example4: Example = { foo: 'some string', bar: 42 }; // error
解决方案冗长,但符合您的需要。一些解释:

  • bar?:从不使用
    ,以阻止具有此类字段的值的可能性
  • 其他接口
    的结果与
    扩展其他接口
  • {[K in any]:never}
    -表示空对象
    {}

类型
接口
同构,您可以将这两个结构连接起来。下面按类型union和intersection实现,还添加了示例接口以显示其工作良好,
&
相当于
扩展
。考虑:

interface OtherInterface {
    field?: string
}
type Example = ({
    foo: string
    bar?: never
} | {
    foo?: never
    bar: number
} | {
    [K in any]: never
}) & OtherInterface

const example1: Example = { foo: 'some string' }; // ok

const example2: Example = { bar: 42 }; // ok

const example3: Example = {}; // ok

const example4: Example = { foo: 'some string', bar: 42 }; // error
解决方案冗长,但符合您的需要。一些解释:

  • bar?:从不使用
    ,以阻止具有此类字段的值的可能性
  • 其他接口
    的结果与
    扩展其他接口
  • {[K in any]:never}
    -表示空对象
    {}

仅仅依靠Typescript的
接口是无法做到这一点的。不应该这样,没有可靠的方法在调用点/调用点上强制实现这一点。为什么不使用两个不同的接口?听起来很像是两个不同的概念。@麦克-这是传递给函数的选项对象中的两个键-都是有效的-但它们不能共存这回答了你的问题吗?仅仅依靠Typescript的
接口
s是没有办法做到这一点的。不应该这样,在调用点/调用点上没有合理的方法来实现这一点。为什么不使用两个不同的接口?听起来很像是两个不同的概念。@麦克-这是传递给函数的选项对象中的两个键-都是有效的-但它们不能共存这回答了你的问题吗?很抱歉,错误地将接口编写为
类型
,现已修复。Heya发现了一个错误,希望您能提供帮助,如果您有
{field:'test'}
而没有
foo
bar
的错误,理想情况下,空对象会通过,但有
field
且没有其他值的对象也会通过。链接到TS游乐场太长,无法发布,因此将添加附加注释。抱歉,错误地将界面编写为
类型
,现已修复Heya,发现此错误,并希望您能提供帮助,如果您有
{field:'test'}
而没有
foo
bar
it错误,理想情况下,一个空对象将通过,但一个具有
字段
且没有其他值的对象也会通过。指向TS游乐场的链接太长,无法发布,因此将添加其他评论。