首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有相同类型的所有成员的类类型

具有相同类型的所有成员的类类型
EN

Stack Overflow用户
提问于 2018-07-03 09:03:06
回答 1查看 299关注 0票数 1

这是我的课:

代码语言:javascript
复制
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 )

EN

回答 1

Stack Overflow用户

发布于 2018-07-03 11:13:45

无法从初始化表达式中获得类型记录来推断其他成员的类型。

不过,我们也可以达到类似的效果,即:

  1. 生成的对象只能包含类型与fs.PathLike兼容的字段(如果指定与fs.PathLike不兼容的类型,则会出现错误)。
  2. 让所有字段的类型为fs.PathLike,而不考虑分配给它们的原始类型(可以是string | Buffer | URL);

为此,我们将使用一个额外的函数,它将接受一个字段隐式类型的对象。如果传入不兼容fs.PathLike或其他路径容器的字段的对象,函数泛型参数的类型约束将触发错误。此函数将返回一个新类型,它将所有原始字段类型替换为fs.PathLike

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51150575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档