TypeScript — Почему должно быть определено статическое свойство, для которого задан определенный объект, неизвестный во время компиляции?

#typescript #compiler-errors #static #undefined-reference

#typescript #ошибки компилятора #статический #неопределенная ссылка

Вопрос:

Я пытаюсь получить доступ к статическому свойству класса. Я получаю ошибку 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| }
 

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' ошибку.

Поскольку это статическое свойство, значение которого должно быть известно во время компиляции, почему должно быть определено статическое свойство, для которого задан определенный объект, неизвестный во время компиляции?

Комментарии:

1. Просто удалите явное определение типа: public static readonly required = { npm: ... }

2. Вы не показываете ReadOnlyDict определение, но я предполагаю, что это что-то вроде { [key: string]: T } , поэтому npm не гарантируется определение — отсюда и ошибка

3. @AlekseyL. Когда я это делаю, моя среда разработки выдает мне всевозможные ошибки:( ReadOnlyDict это встроенный тип для NodeJS, но я вполне уверен, что ваше предположение о том, что оно { [key: string]: T } правильное. Я считаю, что это, по сути, простой старый объект JS со строковыми ключами и значением типа, указанным через предоставленный аргумент параметра типа. В этом случае DirectoryContents . И полученный объект затем замораживается. Но разве компилятор не должен быть в состоянии определить, что npm определено, поскольку оно определено статически? Он может проверить его значение во время компиляции

Ответ №1:

Я смог исправить это , переписав 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);
    }
}

 

Я все еще заинтересован и удивляюсь, почему я получал ошибку раньше. Я предпочитаю оригинальный синтаксис.