#reactjs #typescript #mobx
#reactjs #typescript #mobx
Вопрос:
Я создал объект, используя Typescript в Reactjs.
Ниже приведен код.
Но это приводит к появлению этой ошибки в данных пользовательской информации от пароля до фамилии.
Не могли бы вы дать мне несколько советов?
Дублирующая подпись индекса строки
import { observable, action } from 'mobx';
export interface ISignStore {
email: string,
password: string,
firstName: string,
lastName: string,
handleInput(e: any): void,
handleSubmit(e: any): void
}
export class SignStore implements ISignStore {
@observable
UserInformation: {
[email: string]: '',
[password: string]: '',
[firstName: string]: '',
[lastName: string]: ''
};
@action
handleInput = (e: any): void => {
[e.target.id] = e.target.value;
};
@action
handleSubmit = (e: any): void => {
e.preventDefault();
console.log(this.UserInformation);
};
}
Ответ №1:
Когда вы знаете, какие типы у конкретного объекта, TypeScript позволяет вам использовать интерфейсы, подобные тем, которые вы определили с помощью ISignStore
. Следуя тому же шаблону для UserInformation
, тип будет:
interface IUserInformation {
email: string;
password: string;
firstName: string;
lastName: string;
}
С другой стороны, синтаксис, который вы использовали в настоящее время, вызывается как подпись индекса.
interface IObject {
[k: number]: string
}
По сути, это говорит о том, что у вас есть объект, но вы не знаете, какие ключи у него будут; Но вы уверены, что ключом будет число, а значением — строка. Переменная k
здесь является просто заполнителем, вы можете использовать что угодно в этом месте. Таким образом, из-за этого нет использования там, где должен быть второй ключ для k2: number
. Потому что k: number
этот случай уже рассматривался.
Это ошибка, которую вы получаете, определив, email
, password
и firstName
как ключи в подписи индекса. Они просто дублируются для string
ключа на основе.
Комментарии:
1. Но что, если я действительно хотел иметь вторую подпись индекса, потому что данные, назначенные ей, отличаются? В моем примере я пытаюсь структурировать состояние для Redux и буду использовать
byId
иallIDs
в качестве шаблона. НоId
иIDs
части из них могут измениться, скажем, наbyName
иallNames
. Можно ли это выполнить? (Возможно, мне следует начать новый вопрос).
Ответ №2:
UserInformation: {
[email]: '',
[password]: '',
[firstName]: '',
[lastName]: ''
};
Я думаю, вы уже назначаете тип этим вещам.