【问题标题】:How to define a named array of objects in an interface with TypeScript?如何使用 TypeScript 在接口中定义对象的命名数组?
【发布时间】:2023-04-05 05:37:01
【问题描述】:

如何在 TypeScript 接口中定义 restaurants 属性?

let test = {
  user_id: 5,
  restaurants: [
    {
      restaurant_id: 5,
      restaurant_rank: 5
    },
    {
      restaurant_id: 6,
      restaurant_rank: 6
    }
  ],
  timestamp: 'test'
};

注意

我查看了以下问题,但没有一个能解决我的问题:

How can I define an interface for an array of objects with Typescript?

How can I define an array of objects in typescript?

【问题讨论】:

    标签: arrays node.js typescript


    【解决方案1】:

    查看thisthis 的答案,我得出以下结论:

     interface InterfaceName {
      user_id: number,
      restaurants: { [index: number]: { restaurant_details: Object, restaurant_rank: number } },
      timestamp: Date
    }
    

    但是,我发现它没有被检测为数组,因此更简单的解决方案是:

    interface InterfaceName {
      user_id: number,
      restaurants: { restaurant_details: Object, restaurant_rank: number }[],
      timestamp: Date
    }
    

    这样做将允许 TypeScript 编译器正确地将 InterfaceName.restaurants 视为 array

    【讨论】:

    • 这对我来说效果很好。
    【解决方案2】:

    我会这样写:

    interface IRestaurant {
        restaurant_id: number;
        restaurant_rank: number;
        restaurant_details?: any;
    }
    
    interface IThing {
        user_id: number;
        timestamp: string;
        restaurants: Array<IRestaurant>;
    }
    
    const test: IThing = {
        user_id: 5,
        restaurants: [
            {
                restaurant_id: 5,
                restaurant_rank: 5
            },
            {
                restaurant_id: 6,
                restaurant_rank: 6
            }
        ],
        timestamp: 'test'
    };
    

    还有其他几种方法可以做数组:

    interface IThing {
        user_id: number;
        timestamp: string;
        restaurants: IRestaurant[];
    }
    
    interface IThing {
        user_id: number;
        timestamp: string;
        restaurants: Array<{restaurant_id: number, restaurant_rank: number}>;
    }
    

    我在您的回复中注意到您是restaurant_details: Object。您应该这样做 restaurant_details: any 因为 Object 比任何限制都更严格。见https://stackoverflow.com/a/18961904/2592233

    我还在restaurant_details 之后添加了一个问号,告诉编译器这是可选的,因为您在第一个示例中没有。

    【讨论】:

    • 所以如果restaurants 数组可以同时包含IRestaurantIHotel 条目,那么只有第一种方法可以工作,通过Array&lt;IRestaurant | IHotel&gt; 对吗?
    • 我认为这应该可行,但我会使用新语法并执行[IRestaurant | IHotel][]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 2014-10-17
    • 2021-01-12
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    相关资源
    最近更新 更多