Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 如何在接口(如函数)中推断泛型值_Typescript_Typescript Generics - Fatal编程技术网

Typescript 如何在接口(如函数)中推断泛型值

Typescript 如何在接口(如函数)中推断泛型值,typescript,typescript-generics,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; Typescript没有对变量的部分推断,您需要使用函数来推断接口的类型参数 要做到这一点,最短的方法就是生活: type Foo =

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;

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;



interface IIfFooThenBar<T extends FooBar> {
    fooOrBar: T
    barOrFoo: IfFooThenBar<T>
}

const a = (<T extends FooBar>(o: IIfFooThenBar<T>) => o)({
    fooOrBar: "foo",
    barOrFoo: "foo" // err
})
interface IIfFooThenBar<T extends FooBar> {
  fooOrBar: T
  barOrFoo: IfFooThenBar<T>
}

const a: IIfFooThenBar = {
  fooOrBar: "foo",
  barOrFoo: "foo" // this should result in an error
}
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
})