TypeScript:声明一个类型或接口,该类型或接口的字段名称未知

TypeScript:声明一个类型或接口,该类型或接口的字段名称未知,typescript,typescript-typings,typescript-types,Typescript,Typescript Typings,Typescript Types,我必须为团队对象声明一个接口: export interface Team{ memberUid?: { mail: string name: string photoURL: string } startDate: Timestamp endDate: Timestamp agenda: Array<{ date: Date | Timestamp title: string description: string

我必须为团队对象声明一个接口:

export interface Team{
  memberUid?: {
    mail: string
    name: string
    photoURL: string
  }
  startDate: Timestamp
  endDate: Timestamp
  agenda: Array<{
    date: Date | Timestamp
    title: string
    description: string
  }>
}
但TypeScript会理解团队中的所有字段都应该具有这种结构

正确的处理方法是什么


谢谢

首先让我说我讨厌这种结构。如果有办法将代码重写为更符合逻辑的
Team
类型,那么就这样做。但这能做到吗?是的,它可以<代码>团队必须是
类型
而不是接口,因为接口只能有已知的键

让我们先把它打碎

TeamBase定义始终存在的属性:

interface TeamBase {
  startDate: Timestamp
  endDate: Timestamp
  agenda: Array<{
    date: Date | Timestamp
    title: string
    description: string
  }>
}
下面是一个实用程序类型,可用于通过使用映射类型根据键的类型声明属性:

type HasProperty<Key extends keyof any, Value> = {
    [K in Key]: Value;
}
这正如预期的那样有效。因为我们已经考虑到
uid
未定义的可能性,所以您无法访问
uid
的属性,而不排除
undefined
通过可选的
链接或
if
语句等

function f1(team: Team) {

    const startDate: Timestamp = team.startDate;

    const uid: UidProperties | undefined = team['randomKey']

    const name = uid?.name;

    if ( uid !== undefined ) {
        const mail = uid.mail;
    }
}

让我先说我讨厌这种结构。如果有办法将代码重写为更符合逻辑的
Team
类型,那么就这样做。但这能做到吗?是的,它可以<代码>团队必须是
类型
而不是接口,因为接口只能有已知的键

让我们先把它打碎

TeamBase定义始终存在的属性:

interface TeamBase {
  startDate: Timestamp
  endDate: Timestamp
  agenda: Array<{
    date: Date | Timestamp
    title: string
    description: string
  }>
}
下面是一个实用程序类型,可用于通过使用映射类型根据键的类型声明属性:

type HasProperty<Key extends keyof any, Value> = {
    [K in Key]: Value;
}
这正如预期的那样有效。因为我们已经考虑到
uid
未定义的可能性,所以您无法访问
uid
的属性,而不排除
undefined
通过可选的
链接或
if
语句等

function f1(team: Team) {

    const startDate: Timestamp = team.startDate;

    const uid: UidProperties | undefined = team['randomKey']

    const name = uid?.name;

    if ( uid !== undefined ) {
        const mail = uid.mail;
    }
}
相关的:相关的: