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

Структура корневого каталога.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'.

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

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

Aleksey L. 25.12.2020 09:16

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

Aleksey L. 25.12.2020 09:18

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

Snap 29.12.2020 09:18
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
0
3
209
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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);
    }
}

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

Другие вопросы по теме