Скажем, у меня есть следующий код:
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, как предлагается в ответе ниже.






Не знаю, откуда взялся 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;
}
@NilsLuxton единственный другой вариант - использовать явный тип для this или использовать вспомогательную функцию ... но вспомогательная функция не сделает код красивее, я могу поделиться тем, что у меня есть, если вы не хотите, но я я не особо доволен этим
Честно говоря, все, что у вас есть, полезно - я новичок в TS, поэтому любые дополнительные знания приветствуются! :)
Спасибо за ответ. На самом деле я пытаюсь избежать необходимости разделять определения; Я должен пояснить это в своем вопросе. Я также добавлю фиктивное определение
addProperties, как вы правильно предложили.