TYPESCRIPT:使用两个相同的接口,但只有一个能用

tv6aics1  于 2023-08-08  发布在  TypeScript
关注(0)|答案(2)|浏览(142)

我正在将此IDocumentFilingDto.ts文件写入。

import { DocumentOrigin } from "./IDocumentFilingDto";

// export const enum DocumentOrigin {
//     Original,
//     Kopie,
//     OverenaKopie,
//     DS,
//     DSSKonverzi,
//     Elektronicky,
// }

export interface IDocumentFilingDtoGen {
    UniqueId?: any;
    Title?: string;
    DocumentId?: string;
    Binder?: any;
    CommunicationType?: any;
    Origin?: DocumentOrigin;
    CompanyId?: any;
    DocumentCategoryId?: any;
    DocumentTypeId?: any;
    CompanyOriginal?: string;
    SiteUrl?: string;
    hasSubmitted?: boolean;
    isModified?: boolean;
    IsLocalOnly?: boolean;
}

字符串
而且它工作正常,我没有得到任何类型的错误。
现在我将注解掉本地DocumentOrigin接口。同时,我将在导入的DocumentOrigin中进行注解。

//import { DocumentOrigin } from "./IDocumentFilingDto";

export const enum DocumentOrigin {
    Original,
    Kopie,
    OverenaKopie,
    DS,
    DSSKonverzi,
    Elektronicky,
}

export interface IDocumentFilingDtoGen {
    UniqueId?: any;
    Title?: string;
    DocumentId?: string;
    Binder?: any;
    CommunicationType?: any;
    Origin?: DocumentOrigin;
    CompanyId?: any;
    DocumentCategoryId?: any;
    DocumentTypeId?: any;
    CompanyOriginal?: string;
    SiteUrl?: string;
    hasSubmitted?: boolean;
    isModified?: boolean;
    IsLocalOnly?: boolean;
}


当我这样做的时候,我不再使用导入的DocumentOrigin接口,而是开始使用本地DocumentOrigin接口。这是唯一的变化。
导入的DocumentOrigin接口与本地DocuemntOrigin接口相同。它们是相同的。但令人惊讶的是,一旦我开始使用本地DocumentOrigin接口,我就会得到这个错误。
[07:20:52]错误-键入脚本-源\Web部件\文档上载Web部件\组件\文档头\文档头.tsx(462,60):错误TS 2345:类型为“{唯一ID?:any;标题?:字符串;文档ID?:字符串;活页夹?:任意;通信类型?:any; Ori...“不能赋给”IDocumentFilingDtoGen“类型的参数。[07:20:52]错误-输入脚本-源\Web部件\文档上传Web部件\组件\Dtos\文档归档DtoGen.ts(28,12):错误TS 90010:类型“DocumentOrigin”不能分配给类型“DocumentOrigin.”有两个具有此名称的不同型别存在,但它们是不相关的。
为什么会这样?这说不通啊。这两个接口是相同的,但其中一个工作,而另一个不工作。为什么会这样?
附页:
有人在评论中要求我也提供IDocumentFilingDto.ts文件。在这儿呢。

export const enum DocumentOrigin {
    Original,
    Kopie,
    OverenaKopie,
    DS,
    DSSKonverzi,
    Elektronicky,
}

export interface IDocumentFilingDto {
    UniqueId: any;
    Title: string;
    DocumentId: string;
    Binder?: any;
    CommunicationType: any;
    Origin?: DocumentOrigin;
    CompanyId: any;
    DocumentCategoryId: any;
    DocumentTypeId:any;
    CompanyOriginal?: string;
    SiteUrl?: string;
}

ttygqcqt

ttygqcqt1#

该错误是因为TypeScript将本地DocumentOrigin视为与导入的DocumentOrigin不同的类型,即使它们是相同的。要解决这个问题,只需在IDocumentFilingDtoGen.ts中导入DocumentOrigin,并确保您只使用此目录中的枚举
无论你在哪里使用这个接口,也需要来自同一个地方的枚举

2fjabf4q

2fjabf4q2#

TypeScript枚举在几个方面是特殊的。其中一种方式是枚举成员与其实际值只有单向等价。例如,值为“foo”的枚举成员可以用在可以使用字符串的地方,但值为“foo”的变量(或另一个枚举的成员)不能用在需要第一个枚举的成员的地方。
如果需要使用枚举成员,则必须使用该特定枚举的成员,使用相同的值甚至是来自另一个枚举的相同成员是不够的。
举例来说:

enum MyEnum {
  EXAMPLE = 'example',
}

enum MyOtherEnum {
  EXAMPLE = 'example',
}

function useMyEnum(arg: MyEnum): void {}

useMyEnum(MyEnum.EXAMPLE); // Totally fine

useMyEnum('example'); // Not allowed, even though it's the same value
useMyEnum(MyOtherEnum.EXAMPLE); // Not allowed, even though it's the same value and an enum member

function useValue(arg: 'example'): void {}

useValue(MyEnum.EXAMPLE); // Totally fine
useValue('example'); // Also fine
useValue(MyOtherEnum.EXAMPLE); // Also fine

字符串
TypeScriptPlayground
即使你创建了一个与初始枚举完全相同的成员和名称的新枚举,TypeScript也会识别出它们是不同的,并将它们视为不可互换的。
在这种情况下,enum也是一个const enum,这意味着当编译TypeScript时,enum的值将被替换为它们的实际值,因此就好像enum从未存在过一样。但是,TypeScript仍然要求通过枚举访问值来传递值。
如果您需要创建一个没有此限制的类似枚举的接口,您可以在普通JavaScript对象上使用as constAssert来创建与枚举几乎相同的东西。但是TypeScript不会为您创建枚举的其他部分,例如类型。这是我在工作中经常使用的一种模式:

export const MyEnum = {
  FOO: 'foo',
  BAR: 'bar',
} as const;
export type MyEnum = typeof MyEnum[keyof typeof MyEnum]; // 'foo' | 'bar'


TypeScriptPlayground
这种方法有一些优点,也有一些缺点,但在大多数情况下,它的行为与使用enum关键字创建的枚举非常相似,因此知道它是一个选项至少是有用的。

相关问题