即使我将其导出为 TypeScript 中自己的类型,也无法访问子类属性

Posted

技术标签:

【中文标题】即使我将其导出为 TypeScript 中自己的类型,也无法访问子类属性【英文标题】:Cannot access subclass properties even when I export it as it's own type in TypeScript 【发布时间】:2021-09-06 13:44:07 【问题描述】:

目前我无法访问“Eagle”类的任何属性。我已经导入了我的“AnyBird”类型,但是当我尝试使用特定“Eagle”的属性时,它根本无法识别。它只能看到“鸟”的属性。

我会说“只需将 Eagle 作为类型导入”,但我还需要接受其他更专业的类型。比如“鸽子”、“皮琴”、“鸡”。它需要可扩展,所以我想连接“AnyBird”下的所有类型。

非常感谢您的帮助!

export type AnyBird = Bird | Eagle ;

export interface Eagle extends Bird 
    energyGain: number;
    heatGain: number;
    energyCost: number;
    heatCost: number;



export interface Bird 
    id: number; 
    job: number;
    jobSpecificId: number;
    level: number;


我会在一个单独的文件中举例:

import  AnyBird  from './common/skills/SpecialBirdsFile';

interface Props 
    someBird: AnyBird;



export default class BirdThing extends Component<Props, State> 
    state = 
    render()  
        let someBird = this.props;
        <div>
            allBirds.id <-- WORKS!!!!!!
            allBirds.energyGain <---- FAILS! Cannot be found.
        </div>
    

【问题讨论】:

这可能会有所帮助catchts.com/unions 【参考方案1】:

因为您使用的是联合类型,其中一种类型是另一种类型的超集,解决此问题的一种方法是在您使用对象时检查它是哪种类型。

例如,您可以编写一个名为isEagle 的函数,实现如下:

function isEagle(obj: any): obj is Eagle 
   // however you'd check if this is an "Eagle" object. Ex:
   return obj.hasOwnProperty('energyGain')

要使用Eagle 上的属性,您可以这样调用您的函数:

const myBird: AnyBird =  ... ;

if (isEagle(myBird)) 
   // properties of Eagle are available here
 else 
   // Just a base Bird object.

【讨论】:

以上是关于即使我将其导出为 TypeScript 中自己的类型,也无法访问子类属性的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript 导出使用

TypeScript:用自己的类扩展 Express.Session 接口

s-s-rS 导出为 CSV 格式

visual studio typescript“未捕获的ReferenceError:未在...定义导出” [重复]

TypeScript - 条件模块导入/导出

即使将其类别设置为播放(Swift),音频会话也会与其他会话混合?