Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否需要显式导出和导入所有打算由其他类使用的TypeScript类?_Javascript_Angular_Typescript_Angular Cli_Angular10 - Fatal编程技术网

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

Javascript 是否需要显式导出和导入所有打算由其他类使用的TypeScript类?,javascript,angular,typescript,angular-cli,angular10,Javascript,Angular,Typescript,Angular Cli,Angular10,是否需要显式导出和导入所有打算由其他类使用的类 我目前有一个项目,我从Angular 8升级到Angular 10,并注意到许多以前没有的错误,可能与糟糕的设计或错误的编译器有关(我认为这是糟糕的设计,我是TypeScript的新手,也许新的编译器更挑剔?)。对于我引用的每一个不使用export/import语句的类,在将项目升级到Angular 10之后,我现在都会得到如下所示的错误。这可以通过使每个类上都有关键字“export”来解决,但这意味着我显式地导出是为了在需要的地方导入。然而,这些

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

我目前有一个项目,我从Angular 8升级到Angular 10,并注意到许多以前没有的错误,可能与糟糕的设计或错误的编译器有关(我认为这是糟糕的设计,我是TypeScript的新手,也许新的编译器更挑剔?)。对于我引用的每一个不使用export/import语句的类,在将项目升级到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;
    }
}

是的,您肯定应该使用导入/导出机制

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

window.SomeClass = SomeClass
还有一种臭名昭著的隐式全局模式,它被严格模式捕获:

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

<> P>使用像现在可用的角度的框架,我肯定会认为这是一个糟糕的实践,在没有其他解决方案的特殊情况下,只能求助于它。

我不是一个角度很高的人,所以我真的不明白它是如何在升级之前正常工作的!你是在做什么把它们放到全球范围内,还是只是假设它们最终会在那里?根据经验,如果未导出某些内容,则只能在该特定文件中使用。您以前是否在
PurchaseOrder
上使用过
export
?对我来说,这很有意义,因为编译器不知道
PurchaseOrder
的最终导入者是否有权访问全局类。基本上,我认为你要么在任何地方都必须使用
import/eport
,要么在任何地方都不能使用。@lindapaste我不确定它是否不够严格?看起来在全局范围内结束是预期行为吗?如果我错了,请纠正我,因为我是新手。“在TypeScript中,就像在ECMAScript 2015中一样,任何包含顶级导入或导出的文件都被视为一个模块。相反,没有任何顶级导入或导出声明的文件被视为一个脚本,其内容在全局范围内可用(因此也适用于模块)。@Goku感谢链接,TIL。我不知道这个规则,从其他评论来看,这绝对不是一个普遍的做法。我要做的是为所有基本类型和类创建一个目录。从目录的索引文件中重新导出所有文件。您仍然需要导入,但可以同时执行多个导入。从“/core”@LindaPaiste导入{ChargeNumber,Address,Person}我一定会尝试,因为从长远来看这听起来更简洁!所以我需要在其他类调用的每个类中进行导出?我不知道它以前为什么会工作,它看起来像是在全局范围内执行的行为?如果我错了,请纠正我,因为我是新手。typescriptlang.org/docs/handbook/modules.html在TypeScript中,就像在ECMAScript 2015中一样,任何包含顶级导入或导出的文件都被视为模块。相反,没有任何顶级导入或导出声明的文件被视为一个脚本,其内容在全局范围内可用(因此对模块也是如此)。每个IDE都会将未导入的类/函数/变量标记为错误。另外,如果您两次定义同名的东西,会发生什么情况?我只能建议不要使用它,即使它在某个时候起作用。“是的,你必须使用导入/导出机制。”-不,当然不是,但是使用模块当然比编写将所有内容都放在全局范围内的脚本要好。TypeScript同时支持这两种类型。
// Globally available in the window!
myVar = 'my-Value'