typescript - TypeScript-为什么在编译时不知道设置为已定义对象的静态属性要定义?

标签 typescript compiler-errors static undefined-reference

我正在尝试访问类的静态属性。尝试编译时出现错误Object is possibly 'undefined'。为什么设置为已定义对象的静态属性在编译时未知?
我在自己的文件中定义了三个类:
DirectoryContents.ts

export class DirectoryContents
{
    public readonly directories: ReadonlyArray<string>;

    public readonly files: ReadonlyArray<string>;

    public constructor(directories: ReadonlyArray<string>, files: ReadonlyArray<string>)
    {
        this.directories = directories;
        this.files = files;
    }
}
RootDirStructure.ts
01| import {DirectoryContents} from "./DirectoryContents";
02| import ReadOnlyDict = NodeJS.ReadOnlyDict;
03|
04| export class RootDirStructure
05| {
06|     private static readonly REQUIRED_NPM_DIRECTORIES: ReadonlyArray<string> =
07|         ["node_modules"];
08|
09|     private static readonly REQUIRED_NPM_FILES: ReadonlyArray<string> =
10|         ["package.json", "package-lock.json"];
11|
12|     // RootDirStructure.required.npm set to defined object
13|     public static readonly required: ReadOnlyDict<DirectoryContents> =
14|         {
15|             npm: new DirectoryContents(RootDirStructure.REQUIRED_NPM_DIRECTORIES, RootDirStructure.REQUIRED_NPM_FILES)
16|         }
17| }
索引
01| import {RootDirStructure} from "./RootDirStructure";
02|
03| class Index
04| {
05|     // The following reference to RootDirStructure.required.npm causes error
06|     const requiredNPMDirectories: ReadonlyArray<string> = RootDirStructure.required.npm.directories;
07| }
RootDirStructure.ts的第15行,其静态属性被设置为已定义的对象。但是,当在Index.ts的第6行上引用该对象时,它将创建Object is possibly 'undefined'错误。
由于它是一个静态属性,其值应在编译时知道,为什么设置为已定义对象的静态属性在编译时不被定义?

最佳答案

我可以通过重写RootDirStructure.ts来修复它。
我将静态属性RootDirStructure.required设置为静态内部类,而不是类型为ReadOnlyDict<DirectoryContents>的属性,所以现在RootDirStructure.ts看起来像:

import {DirectoryContents} from "./DirectoryContents";

export class RootDirStructure
{
    private static readonly REQUIRED_NPM_DIRECTORIES: ReadonlyArray<string> =
        ["node_modules"];
    private static readonly REQUIRED_NPM_FILES: ReadonlyArray<string> =
        ["package.json", "package-lock.json"];
    // RootDirStructure.required.npm set to defined object
    public static readonly required = class
    {
        public static readonly npm: DirectoryContents = new DirectoryContents(RootDirStructure.REQUIRED_NPM_DIRECTORIES, RootDirStructure.REQUIRED_NPM_FILES);
    }
}

我仍然很感兴趣,想知道为什么以前我得到了错误。我更喜欢原始语法。

关于typescript - TypeScript-为什么在编译时不知道设置为已定义对象的静态属性要定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65446191/

相关文章:

javascript - 未捕获的TypeError : Cannot read property 'image' of undefinded (p5.js)

php - static::call 不可用时如何解决?

typescript - aws-cdk-lib vs @aws-cdk/core, @aws-cdk/aws-iam, ... 的目的是什么?

typescript - TypeScript 有 toString() 版本吗

javascript - tsc编译时不报错

angular - Angular 如何使用 *ngFor 过滤未知数量的元素?

Angular:无法启动服务:主机版本 "0.14.11"与二进制版本 "0.14.22"不匹配

android - Android Studio中构建Gradle文件中的问题

javascript - 如何在 javascript 类中创建静态字段

c - 分配静态内存(作为 malloc 替换)