Typescript 一种类型脚本接口,允许两个可选键中的一个或无,但不能同时允许两个
有没有办法定义一个TypescriptTypescript 一种类型脚本接口,允许两个可选键中的一个或无,但不能同时允许两个,typescript,Typescript,有没有办法定义一个Typescript接口,该接口允许对象中的两个可选键中的一个,或者没有一个,但不是两个 以下是我试图实现的一个简化示例: const example1={foo:'some string'}//应通过-只能有“foo:string” 常数example2={bar:42};//应通过-只能有“条:编号” 常量example3={};//应该通过-foo和bar都是可选的 const example4={foo:'some string',bar:42};//应抛出类型脚本错误
接口
,该接口允许对象中的两个可选键中的一个,或者没有一个,但不是两个
以下是我试图实现的一个简化示例:
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游乐场的链接太长,无法发布,因此将添加其他评论。