扩展接口以包含日期类型
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'
}
我需要在 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'
}