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);
}
}
我仍然很感兴趣,想知道为什么我之前会收到错误消息。我更喜欢原来的语法。
我正在尝试访问 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);
}
}
我仍然很感兴趣,想知道为什么我之前会收到错误消息。我更喜欢原来的语法。