【问题标题】:Typescript - Retrieve an object inside another objectTypescript - 在另一个对象中检索一个对象
【发布时间】:2020-11-28 02:04:07
【问题描述】:

我想从 main_object 集合中检索对象“rename_fields”以使用其字段值:

export interface StdMap<T = string> {
    [key: string]: T;
}

export type StdFileBasedPluginHandlerConfiguration<
    SourceType extends StdMap<string | number>
> = {
    type: "std_file";
    data_files: string[];
    exclude_fields: string[];
    value_fields: string[];
    rename_fields: StdMap<StdMap<string>>;
    descriptor: string;
};

export type PluginHandlerConfiguration =
    | StdFileBasedPluginHandlerConfiguration<any>
    | { type: "not_required_configuration" }
    | undefined;

// export type PluginHandlerConfiguration = StdFileBasedPluginHandlerConfiguration<
//     any
// >;


export interface CollectorConfiguration {
    lastUpdate: Date;
    hashFile: string;
    code: string;
    plugin_path?: string;
    plugin_configuration: PluginHandlerConfiguration;
    related_codes?: string[];
    collections: { original: string; names: string[] };
    skipCollectData?: boolean;
    skipFlatGeneration?: boolean;
    extra_grouping_fields: string[];
    has_origins: boolean;
    force?: boolean;
    notify?: boolean;
    origins_that_generate_extra_records?: string[];
}

const main_object: CollectorConfiguration=
{ 
    "code" : "my_code", 
    "lastUpdate" : new Date("2020-01-28T00:00:00.000+0000"), 
    "collections" : {
        "original" : "collection", 
        "names" : [
            "collection_1",
            "collection_2"
        ]
    }, 
    "hashFile" : "ffc0b10ac2e7cd681f5666a474063165f5507212c45abf4ee2f85482ea866985,13c1dd232e13bc6d20ffe6213f38c5152e1f5e7f72366b461602d3cd876ef40f", 
    "extra_grouping_fields" : [
        "type"
    ], 
    "has_origins" : true, 
    "plugin_path" : "file/path_to_plugin", 
    "plugin_configuration" : {
        "type" : "std_file", 
        "data_files" : [
            "../file1.csv", 
            "../file2.csv"
        ], 
        "value_fields" : [
            "value1", 
            "value2"
        ], 
        "descriptor" : "type", 
        "exclude_fields" : [
            "excl1", 
            "excl2"
        ], 
        "rename_fields" : {
            "flat" : {
                "TEST1" : "test1", 
                "TEST2" : "test2", 
                
            }
        }
    }
}

    


Object.keys(main_object).forEach((key: Date | string | StdFileBasedPluginHandlerConfiguration<any> | boolean)=>{
    console.log(`KEY: ${key} - typeof key: ${typeof key}`);
    Object.keys(main_object).forEach((keyConfiguration) => {
        console.log(`DEBUG-->configuration keys: ${keyConfiguration}`);
        if (keyConfiguration === "plugin_configuration") {
            Object.keys(main_object[keyConfiguration]!).forEach(
                (keyPluginConfiguration: any) => {
                    console.log(
                        `DEBUG-->plugin_configuration - ${keyPluginConfiguration} --- END plugin_configuration`
                    );
                    if (keyPluginConfiguration === "rename_fields") {
                        Object.keys(
                            keyConfiguration![keyPluginConfiguration]!
                        ).forEach((keyRenameFields: any) => {
                            console.log(
                                `DEBUG-->rename_fields - ${keyRenameFields} --- END rename_fields`
                            );
                        });
                    }
                }
            );
        }
    });
});


但我遇到了错误:

test_object_loop.js:50
Object.keys(keyConfiguration[keyPluginConfiguration]).forEach(function (keyRenameFields) { ^
TypeError:无法将 undefined 或 null 转换为对象
在 Function.keys ()
在 test_object_loop.js:50:28
在 Array.forEach ()
在 test_object_loop.js:47:56
在 Array.forEach ()
在 test_object_loop.js:44:30
在 Array.forEach ()
在对象。 (test_object_loop.js:42:26)
在 Module._compile (internal/modules/cjs/loader.js:1137:30)
在 Object.Module._extensions..js (internal/modules/cjs/loader.js:1157:10)

如何在具有特定类型的另一个对象中检索一个对象?

【问题讨论】:

    标签: javascript typescript object types typeguards


    【解决方案1】:

    我不知道你为什么使用如此嵌套的循环,但为了获得rename_fields 的值,请按照以下步骤操作:

    1. 最终您可以通过main_object.plugin_configuration.rename_fields 访问该值
    2. 因为plugin_configuration 的类型被定义为PluginHandlerConfiguration 然而...
      • plugin_configuration 可能是 { type: "not_required_configuration" }
        • 如果是这样,您将无法访问其rename_fields,因为它没有这样的字段
      • plugin_configuration 可能是 undefined
        • 如果是这样,您甚至无法访问其type 字段

    所以理论上的代码应该是这样的:

    // Make sure `plugin_configuration` is not undefined
    if (main_object.plugin_configuration) {
      // Make sure `plugin_configuration` has `rename_fields` field
      // by checking `type` field is "std_file"
      if (main_object.plugin_configuration.type === "std_file") {
        // Now you can safely access `rename_fields`
        const renameFields = main_object.plugin_configuration.rename_fields
      }
    }
    

    这两个if条件可以组合,如下面更简单实用的代码:

    if (main_object.plugin_configuration && main_object.plugin_configuration.type === "std_file") {
      const renameFields = main_object.plugin_configuration.rename_fields
    }
    

    【讨论】:

      猜你喜欢
      • 2021-11-18
      • 2018-02-10
      • 2020-04-06
      • 1970-01-01
      • 2020-05-02
      • 2022-11-19
      • 1970-01-01
      • 2018-05-05
      • 1970-01-01
      相关资源
      最近更新 更多