Можно ли добавить информацию о типе во время компиляции?

Скажем, у меня есть следующий код:

function addProperties(keys: String[]): Object
{
    // For the sake of example, this is a concrete return
    return {
        firstProperty: "first_value",
        secondProperty: "second_value"
    };
}

export default {

    propertyBag: {
        ...addProperties(["firstProperty", "secondProperty"])
    },

    someMethod() {
        return this.firstProperty;
    }

};

TypeScript, естественно, жалуется, что firstProperty не существует для этого объекта.

Можно ли «динамически» добавить информацию о типе, чтобы TS знал, что на этом объекте существуют как firstProperty, так и secondProperty?

В идеале я хотел бы иметь возможность сделать это без отдельного определения propertyBag, как предлагается в ответе ниже.

Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой 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 для повышения производительности приложения путем загрузки модулей только тогда, когда они...
1
0
28
1

Ответы 1

Не знаю, откуда взялся addProperty и каково его определение, но предполагая, что он возвращает объект со свойствами, указанными в качестве параметров, вы можете указать, что someMethod будет иметь параметр this того же типа, что и мешок свойств. Единственная загвоздка в том, что вам нужно отделить определение propertyBag от export default:

const propertyBag = {
    ...addProperties(["firstProperty", "secondProperty"])
};
export default {
    propertyBag,
    someMethod(this: typeof propertyBag) {
        return this.firstProperty;
    }
};

// Assumed definition 
function addProperties<T extends string>(a: T[]) : { [P in T]: any} {
    return null as any;
}

Спасибо за ответ. На самом деле я пытаюсь избежать необходимости разделять определения; Я должен пояснить это в своем вопросе. Я также добавлю фиктивное определение addProperties, как вы правильно предложили.

Nils Luxton 12.06.2018 11:12

@NilsLuxton единственный другой вариант - использовать явный тип для this или использовать вспомогательную функцию ... но вспомогательная функция не сделает код красивее, я могу поделиться тем, что у меня есть, если вы не хотите, но я я не особо доволен этим

Titian Cernicova-Dragomir 12.06.2018 11:19

Честно говоря, все, что у вас есть, полезно - я новичок в TS, поэтому любые дополнительные знания приветствуются! :)

Nils Luxton 12.06.2018 11:27

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