扩展接口以包含日期类型

Extend interface to contain a date type

我需要在 Typescript 中扩展一个接口以包含日期类型。

我试过以下方法

interface WithDate {
  [key: string]: Date;
}

但是当我尝试扩展 WithDate 时,出现错误:

interface Person extends  WithDate {
  id: number; // Property 'id' of type 'number' is not assignable to string index type 'Date'
  name: string;
  date: Date;
}

有什么办法可以解决这个错误吗?非常感谢

WithDate 中命名字段:

interface WithDate {
  date: Date; // Note field name : date
}
interface Person extends  WithDate {
  id: number;
  name: string;
}
interface WithDate {
  [key: string]: Date;
}

通过这个接口,你告诉 TypeScript 实现这个接口的对象可以有 string 个键,但只有 Date 个值。

const obj: IWithDate = {
  key1: new Date(), // OK because it's a date
  key2: new Date('2020-01-01') // OK, another date
  key3: '2020-01-01' // Error, not a Date
  key4: true // Error, not a Date
  key5: 123 // Error, not a Date 
  // and any other objects besides `Date`s will cause a compiler error
}

因此,当您 extend WithDate 接口时,TypeScript 会看到索引签名并尝试合并这些接口,但是,这里存在冲突的形状:

{ id: string }

{ [k: string]: Date }

所以编译器尽力解决这些冲突,因为这是一个相当模糊的情况,TypeScript 必须选择一些形状,它选择 { [k: string]: Date } 因为这是最 expected/correct 的行为用于接口扩展。

您可能打算这样做:

interface WithDate {
 date: Date
}

interface Person extends WithDate {
 id: number;
 name: string;
}

const person: Person = {
 id: 1,
 date: new Date(),
 name: 'bob'
}