Typescript具有这个不错的功能,在给定类型的情况下
type Foo = "foo"
type Bar = "bar"
type FooBar = Foo | Bar;
type IfFooThenBar<T extends FooBar> = T extends Foo ? Bar :
T extends Bar ? Foo : never;
和一个函数
function ifFooThenBar<T extends FooBar>(fooOrBar: T, barOrFoo: IfFooThenBar<T>): void
它从函数参数列表中推断出T
并将其应用于IfFooThenBar<T>
并缩小了该参数的潜在候选者,因此ifFooThenBar("foo", "foo")
将不会编译。
在工作的界面上是否有类似的模式:
interface IIfFooThenBar<T extends FooBar> {
fooOrBar: T
barOrFoo: IfFooThenBar<T>
}
const a: IIfFooThenBar = {
fooOrBar: "foo",
barOrFoo: "foo" // this should result in an error
}
答案 0 :(得分:1)
Typescript没有对变量的部分推断,您需要使用一个函数来推断接口的type参数。
最简单的方法是使用IIFE:
type Foo = "foo"
type Bar = "bar"
type FooBar = Foo | Bar;
type IfFooThenBar<T extends FooBar> = T extends Foo ? Bar :
T extends Bar ? Foo : never;
interface IIfFooThenBar<T extends FooBar> {
fooOrBar: T
barOrFoo: IfFooThenBar<T>
}
const a = (<T extends FooBar>(o: IIfFooThenBar<T>) => o)({
fooOrBar: "foo",
barOrFoo: "foo" // err
})