Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/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_Union Types - Fatal编程技术网

TypeScript联合类型缺少属性

TypeScript联合类型缺少属性,typescript,union-types,Typescript,Union Types,我有三种类型: export type FooInitialStateType = { Id: string; Name: string; Email: string; Password: string }; export type BarInitialStateType = { Id: string; Balance: number; }; export type BazInitialStateType = { Id: string; Limit: numb

我有三种类型:

export type FooInitialStateType = {
  Id: string;
  Name: string;
  Email: string;
  Password: string
};

export type BarInitialStateType = {
  Id: string;
  Balance: number;
};

export type BazInitialStateType = {
  Id: string;
  Limit: number;
};
然后我创建了一个联合类型,如下所示:

export type FooBarBazType = FooInitialStateType | BarInitialStateType | BazInitialStateType
然后,我有一个通用方法处理包含上述所有3种类型的数组:

  getFooBarBaz (
    events: FooBarBazType[]
  ): {
    foobarbaz0: FooBarBazType;
  } {
    const foobarbaz0 = <FooBarBazType>events[0];
    return {
      foobarbaz0
    };
  }
我得到一个TS错误:

类型“FooBarBazType”不可分配给类型“FooInitialStateType”

因为
FooInitialStateType
不包含来自
BarInitialStateType
BazInitialStateType
的属性

实际问题:

  • 如何使用泛型方法的Union类型来接受包含所有3种类型的数组,但在调用方法的地方,指定返回值的确切类型

  • 在这里使用联合类型正确吗?我有一个方法,它接受3种不同的类型,并生成一种类型。我需要调用函数知道并指定返回的类型


  • 您可能希望
    getFooBarBaz()
    成为一个输出类型取决于输入类型的函数:

    function getFooBarBaz<T extends FooBarBazType>(events: T[]): { foobarbaz0: T; } {
        const foobarbaz0 = events[0];
        return {
            foobarbaz0
        };
    }
    
    这有用吗?祝你好运


    您可以使用类型断言来覆盖编译器,但是…您不能(本质上)在这里安全地向下转换。根据编译器的说法不是这样的。我不确定你真正需要的是工会类型——这不是更像是一个普通人的工作吗?@VLAZ如果你能详细说明,那就太好了!好的,似乎您期望一个包含一种类型元素的数组,并且该元素将是
    Foo
    Bar
    Baz
    ,结果将是相同类型的数组。您在这里描述的输入意味着您可以接受
    Foo
    /
    Bar
    /
    Baz
    项的任何组合,结果将是其中之一,但无法保证是哪一个。因此,根据编译器的说法,向方法提供一个
    Foo
    项数组并生成
    Baz
    ,是完全有效的。或者任何组合。您似乎试图在同一超类型的其他子类型的数组中找到一个子类型的实例,在这种情况下(就类型和实际功能而言),您可能应该阅读此处的代码,而不是如中所述的。例如,
    fooEvents
    不会在任何地方声明。理想情况下,可以将代码放入一个独立的IDE中,就像这样,它将演示您所面临的问题,并且只演示该问题。
    function getFooBarBaz<T extends FooBarBazType>(events: T[]): { foobarbaz0: T; } {
        const foobarbaz0 = events[0];
        return {
            foobarbaz0
        };
    }
    
    const fooEvents = [
        {
            Id: "foo",
            Name: "Foobert",
            Email: "foobert@example.com",
            Password: "Emb4rr4ss|ngP455w%?d"
        }
    ];
    
    const {
        foobarbaz0
    }: {
        foobarbaz0: FooInitialStateType;
    } = getFooBarBaz(fooEvents); // no error now