TypeScript - 为什么设置为编译时未知的已定义对象的静态 属性 被定义?

TypeScript - Why is a static property that is set to a defined object not known at compile time to be defined?

我正在尝试访问 class 的静态 属性。当我尝试编译它时出现错误 Object is possibly 'undefined'。为什么设置为编译时未知的已定义对象的静态 属性 被定义?

我在自己的文件中定义了三个 classes:

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

Index.ts

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 设为静态内部 class 而不是类型 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);
    }
}

我仍然很感兴趣,想知道为什么我之前会收到错误消息。我更喜欢原来的语法。