打字稿:使用基于 属性 值的一个或另一个接口
Typescript: use either the one or other interface based on property value
我想要一种基于给定的其他属性实现一个或另一个属性的类型 属性。
该类型应具有以下基本结构:
interface LinkBase {
label: string;
isTextLink: boolean;
}
根据 isTextLink
它应该有 linkReference
或 linkText
作为附加的非可选 属性:
// 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
}
我想要一种基于给定的其他属性实现一个或另一个属性的类型 属性。
该类型应具有以下基本结构:
interface LinkBase {
label: string;
isTextLink: boolean;
}
根据 isTextLink
它应该有 linkReference
或 linkText
作为附加的非可选 属性:
// 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
}