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;
}
}
相关的:相关的: