Вы можете использовать индексный доступ в машинописном шрифте к объекту, только если машинописный текст может доказать, что ключ, который вы используете для доступа к объекту, является допустимым ключом для типа.Это означает, что либо аргумент индекса имеет строковый литерал, являющийся ключом объекта, либо сам объект имеет сигнатуру индекса:
Определение сигнатуры индекса:
export interface IUser {
[n: string]: string | boolean | string[] | undefined;
username: string;
email?: string;
isActive: boolean;
group: string[];
}
interface Field {
name: string;
label: string;
placeholder: string;
help?: string | React.ReactNode;
}
declare let user: IUser;
declare let field: Field;
let value = user[field.name] // ok because of the index signature
Аргумент индекса представляет собой объединение ключей:
export interface IUser {
username: string;
email?: string;
isActive: boolean;
group: string[];
}
interface Field {
name: keyof IUser;
label: string;
placeholder: string;
help?: string | React.ReactNode;
}
declare let user: IUser;
declare let field: Field;
let value = user[field.name] // ok because of name is a property of IUser
Я бы рекомендовал использовать против подписи индекса, как только вы добавите, что вы можете получить доступ к объекту с помощью любой ключ (user.notHere
не является ошибкой с подписью индекса).
Если у вас уже есть поле name
типа string
и по какой-то причине вы не можете его изменить, но выдостаточно уверенно, что это ключ интерфейса, вы можете использовать утверждение типа:
export interface IUser {
username: string;
email?: string;
isActive: boolean;
group: string[];
}
interface Field {
name: string;
label: string;
placeholder: string;
help?: string | React.ReactNode;
}
declare let user: IUser;
declare let field: Field;
let value = user[field.name as keyof IUser] // ok bacuse of the assertion