首页 > 解决方案 > TypeScript - 为什么设置为已定义对象的静态属性在编译时未知?

问题描述

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

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

目录内容.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| }

索引.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| }

在第 15 行RootDirStructure.ts,它的静态属性被设置为一个已定义的对象。然而,当在第 6 行引用该对象时Index.ts,它会产生Object is possibly 'undefined'错误。

既然它是一个静态属性,其值应该在编译时就知道,为什么要定义一个设置为在编译时不知道的已定义对象的静态属性呢?

标签: typescriptcompiler-errorsstaticundefined-reference

解决方案


我能够通过重写来修复它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);
    }
}

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


推荐阅读