Я пытаюсь получить доступ к статическому свойству класса. Я получаю сообщение об ошибке 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;
}
}
Структура корневого каталога.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| }
В строке 15 RootDirStructure.ts
его статическое свойство устанавливается на определенный объект. Тем не менее, когда объект упоминается в строке 6 Index.ts
, возникает ошибка Object is possibly 'undefined'
.
Поскольку это статическое свойство, значение которого должно быть известно во время компиляции, почему должно быть определено статическое свойство, для которого задан определенный объект, неизвестный во время компиляции?
Вы не показываете определение ReadOnlyDict
, но я предполагаю, что это что-то вроде { [key: string]: T }
, поэтому определение npm
не гарантируется - отсюда и ошибка
@АлексейЛ. Когда я это делаю, моя IDE выдает всевозможные ошибки :( ReadOnlyDict
— это встроенный тип NodeJS, но я вполне уверен, что ваше предположение, что это { [key: string]: T }
, верно. Я считаю, что это, по сути, старый простой объект JS со строковыми ключами и значение типа, указанное с помощью предоставленного аргумента параметра типа. В этом случае DirectoryContents
. И результирующий объект затем замораживается. Но разве компилятор не должен сделать вывод, что npm
определен, поскольку он определен статически? Он может проверить его значение во время компиляции
Я смог исправить это, переписав 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);
}
}
Мне все еще интересно, и я удивляюсь, почему раньше я получал ошибку. Я предпочитаю оригинальный синтаксис.
Просто удалите явное определение типа:
public static readonly required = { npm: ... }