Как вывести общие значения в интерфейсах, как в функциях - PullRequest
0 голосов
/ 16 мая 2019

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 Ответ

1 голос
/ 16 мая 2019

Typescript не имеет частичного вывода для переменных, вам нужно использовать функцию для вывода параметра типа интерфейса.

Самый короткий способ сделать это с помощью 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
})
...