首页 > 解决方案 > 是否所有打算被其他类使用的 TypeScript 类都需要显式导出和导入?

问题描述

是否所有打算被其他类使用的类都需要显式导出和导入?

我目前有一个从 Angular 8 升级到 Angular 10 的项目,并注意到很多以前不存在的错误可能与糟糕的设计或错误的编译器有关(我认为这是糟糕的设计我是 TypeScript 的新手,也许新的编译器更挑剔?)。对于我引用的每个未使用导出/导入语句的类,在将我的项目升级到 Angular 10 后,我现在得到如下所示的错误。这可以通过使每个类都具有关键字“export”来解决。 ,但这意味着我正在明确导出,目的是在需要的地方导入。然而,这些类的目的是在应用程序的全局范围内,我希望每个其他模块都可以看到这些,而不必显式导入它们,因为这些帮助类和类型无处不在。但是,在注意到这些错误之后,我想做的事情似乎不太可能。总而言之,我是否需要显式导出和导入我打算引用的所有类?

旧代码

 class Person {
        public first:string;
        public last:string;
        constructor(
            first:string,
            last:string,
            )
        {
            this.first = first;
            this.last = last;
        }
        get fullName(): string {
            return this.first + ' ' + this.last;
        }
    }

新代码

export class Person { //I would rather not use the export keyword since Person should be used everywhere
    public first:string;
    public last:string;
    constructor(
        first:string,
        last:string,
        )
    {
        this.first = first;
        this.last = last;
    }
    get fullName(): string {
        return this.first + ' ' + this.last;
    }
}

参考类:

// import { Person } from '../sharedTypes/person'; //needed if I use the export in the Person class
export class PurchaseOrder {
    public name: string;
    public poChargeNumber: ChargeNumber;
    public siteLocation: Address;
    public deliverTo: Person;
    public vendor: Vendor;
    public lineItems: LineItem[];
    constructor(
        chargeNum: ChargeNumber,
        siteLocation: Address,
        deliverTo: Person,
        lineItems: LineItem[],
        )
    {
        this.poChargeNumber = chargeNum;
        this.siteLocation = siteLocation;
        this.deliverTo = deliverTo;
        if (lineItems === null || lineItems === undefined)
            this.lineItems = new Array<LineItem>();
        else
            this.lineItems = lineItems;
    }
}

错误:

src/app/purchaseorder-doc/purchaseOrder.ts:13:20 - error TS2304: Cannot find name 'ChargeNumber'.

13         chargeNum: ChargeNumber,
                      ~~~~~~~~~~~~
src/app/purchaseorder-doc/purchaseOrder.ts:14:23 - error TS2304: Cannot find name 'Address'.

14         siteLocation: Address,
                         ~~~~~~~
src/app/purchaseorder-doc/purchaseOrder.ts:15:20 - error TS2304: Cannot find name 'Person'.

m15         deliverTo: Person,

标签: javascriptangulartypescriptangular-cliangular10

解决方案


是的,您绝对应该使用导入/导出机制。

在过去,JavaScript 开发人员会编写将变量/类放入全局范围的代码,例如:

window.SomeClass = SomeClass

还有臭名昭著的隐式全局,被严格模式捕获:

// Globally available in the window!
myVar = 'my-Value'

现在有了像 Angular 这样的框架,我肯定会认为这是一种不好的做法,只有在没有其他解决方案可用的特殊情况下才会使用它。


推荐阅读