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

Do all TypeScript classes that intend to be used by other classes need to be explicitly exported and imported?

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

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

旧代码

 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;
    }
}

引用 Class:

// 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,

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

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

window.SomeClass = SomeClass

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

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

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