打字稿:使用基于 属性 值的一个或另一个接口

Typescript: use either the one or other interface based on property value

我想要一种基于给定的其他属性实现一个或另一个属性的类型 属性。

该类型应具有以下基本结构:

interface LinkBase {
  label: string;
  isTextLink: boolean;
}

根据 isTextLink 它应该有 linkReferencelinkText 作为附加的非可选 属性:

// if isTextLink is false
export interface LinkWithLinkReference extends LinkBase {
  linkReference: LinkReference;
}

// if isTextLink is true
export interface LinkWithLinkText extends LinkBase {
   linkText: string;
}

我试图创建一个联合类型,其中允许一个或另一个接口:

export type Link= LinkWithLinkReference | LinkWithLinkText;

但它没有考虑 isTextLink 值,在使用中它给我以下错误:

"属性 'linkText' 在类型 'Link' 上不存在。 属性 'linkText' 在类型 [=37 上不存在=]."

创建和使用此类类型的最佳方式是什么?

isTextLink可以去掉。

为了让这个更简单,界面将做:

interface Link {
  label: string;
  content: LinkReference | string ;
}

typeof content 会给你 link 类型。

但如果你真的出于某种原因想要分开,generics 可以提供帮助:

interface LinkBase<T> {
  label: string;
// content can be string or LinkReference
// content is an example name, use whatever name you want
  content: T ;
// other common attributes down here
}
export interface LinkWithLinkReference extends LinkBase<LinkReference> {
// other specific attributes down here

}
export interface LinkWithLinkText extends LinkBase<string> {
// other specific attributes down here

}