Это мой класс:
class CONSTANT {
static readonly PATH = new class {
/** private visibility because these relative paths don't make sense for direct access, they're only useful to path class
*
* @type {{AFTER_EFFECTS_TEMPLATE_BINARY_VERSION: module:fs.PathLike; AFTER_EFFECTS_TEMPLATE_XML_VERSION: module:fs.PathLike; RELATIVE_PATH_TO_AFTER_EFFECTS: module:fs.PathLike; OUTPUT_DIRECTORY_NAME: module:fs.PathLike; INPUT_DIRECTORY_NAME: module:fs.PathLike; ASSETS_DIRECTORY_NAME: module:fs.PathLike}}
*/
private readonly RELATIVE = new class {
readonly AFTER_EFFECTS_TEMPLATE_FILENAME: fs.PathLike = '\\video-template.aep';
readonly AFTER_EFFECTS_TEMPLATE_BINARY_VERSION: fs.PathLike = `\\assets\\aep-template\\src${this.AFTER_EFFECTS_TEMPLATE_FILENAME}`;
readonly AFTER_EFFECTS_TEMPLATE_XML_VERSION: fs.PathLike = '\\assets\\aep-template\\intermediates\\video-template.aepx';
readonly RELATIVE_PATH_TO_AFTER_EFFECTS: fs.PathLike = '\\Adobe\\Adobe After Effects CC 2018\\Support Files\\AfterFX.exe';
readonly OUTPUT_DIRECTORY_NAME: fs.PathLike = '\\output';
readonly INPUT_DIRECTORY_NAME: fs.PathLike = '\\input';
readonly ASSETS_DIRECTORY_NAME: fs.PathLike = '\\assets';
};
}
}
Я хочу ввести анонимный класс RELATIVE, чтобы иметь свойства только типа fs.PathLike. Возможно ли это без упоминания типа на каждой собственности?
PS: Причина, по которой у меня есть это, а не литерал объекта, заключается в том, что я могу комбинировать свойства класса между собой, см. https://stackoverflow.com/a/50929798/1311745






Невозможно заставить машинописный текст вывести тип члена, отличный от выражения инициализации.
Тем не менее, мы можем добиться аналогичного эффекта, а именно:
fs.PathLike (и мы получим ошибку, если назначим тип, несовместимый с fs.PathLike)fs.PathLike независимо от присвоенного им исходного типа (которым может быть string | Buffer | URL);Для этого мы будем использовать дополнительную функцию, которая будет принимать объект, поля которого имеют неявный тип. Ограничение типа для универсального параметра функции вызовет ошибку, если мы передадим объект с полями, которые не совместимы с fs.PathLike или контейнером других путей. Эта функция вернет новый тип, в котором все исходные типы полей будут заменены на fs.PathLike.
type PathLikeContainer<T> = {
[P in keyof T] : T[P] extends fs.PathLike ? fs.PathLike : T[P] extends object ? PathLikeContainer<T[P]> : never;
}
function asPathContainer<T extends PathLikeContainer<T>>(p: T) : PathLikeContainer<T>{
return p;
}
class CONSTANT {
static readonly PATH = asPathContainer(new class {
readonly RELATIVE = new class {
readonly AFTER_EFFECTS_TEMPLATE_FILENAME = '\\video-template.aep';
readonly AFTER_EFFECTS_TEMPLATE_BINARY_VERSION = `\\assets\\aep-template\\src${this.AFTER_EFFECTS_TEMPLATE_FILENAME}`;
readonly AFTER_EFFECTS_TEMPLATE_XML_VERSION = '\\assets\\aep-template\\intermediates\\video-template.aepx';
readonly RELATIVE_PATH_TO_AFTER_EFFECTS = '\\Adobe\\Adobe After Effects CC 2018\\Support Files\\AfterFX.exe';
readonly OUTPUT_DIRECTORY_NAME = '\\output';
readonly INPUT_DIRECTORY_NAME = '\\input';
readonly ASSETS_DIRECTORY_NAME = '\\assets';
//readonly INVALID = 0; // will be an error
};
})
}
CONSTANT.PATH.RELATIVE.AFTER_EFFECTS_TEMPLATE_BINARY_VERSION //fs.PathLike