这是我的课:
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 )
发布于 2018-07-03 11:13:45
无法从初始化表达式中获得类型记录来推断其他成员的类型。
不过,我们也可以达到类似的效果,即:
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.PathLikehttps://stackoverflow.com/questions/51150575
复制相似问题