如何在函数中的接口中推断通用值

时间:2019-05-16 13:02:34

标签: typescript typescript-generics

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
}

1 个答案:

答案 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
})