Пробую TypeScript для проекта React, и я застрял на этой ошибке:
Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{ train_1: boolean; train_2: boolean; train_3: boolean; train_4: boolean; }'.
No index signature with a parameter of type 'string' was found on type '{ train_1: boolean; train_2: boolean; train_3: boolean; train_4: boolean; }'
Что появляется, когда я пытаюсь отфильтровать массив в моем компоненте
.filter(({ name }) => plotOptions[name]);
До сих пор я смотрел статью «Индексирование объектов в TypeScript» ( https://dev.to/kingdaro/indexing-objects-in-typescript-1cgi ), поскольку в ней была аналогичная ошибка, но я попытался добавить подпись индекса в типа, plotTypes
и я все еще получаю ту же ошибку.
Код моего компонента:
import React, { Component } from "react";
import createPlotlyComponent from "react-plotly.js/factory";
import Plotly from "plotly.js-basic-dist";
const Plot = createPlotlyComponent(Plotly);
interface IProps {
data: any;
}
interface IState {
[key: string]: plotTypes;
plotOptions: plotTypes;
}
type plotTypes = {
[key: string]: boolean;
train_1: boolean;
train_2: boolean;
train_3: boolean;
train_4: boolean;
};
interface trainInfo {
name: string;
x: Array<number>;
y: Array<number>;
type: string;
mode: string;
}
class FiltrationPlots extends Component<IProps, IState> {
readonly state = {
plotOptions: {
train_1: true,
train_2: true,
train_3: true,
train_4: true
}
};
render() {
const { data } = this.props;
const { plotOptions } = this.state;
if (data.filtrationData) {
const plotData: Array<trainInfo> = [
{
name: "train_1",
x: data.filtrationData.map((i: any) => i["1-CumVol"]),
y: data.filtrationData.map((i: any) => i["1-PressureA"]),
type: "scatter",
mode: "lines"
},
{
name: "train_2",
x: data.filtrationData.map((i: any) => i["2-CumVol"]),
y: data.filtrationData.map((i: any) => i["2-PressureA"]),
type: "scatter",
mode: "lines"
},
{
name: "train_3",
x: data.filtrationData.map((i: any) => i["3-CumVol"]),
y: data.filtrationData.map((i: any) => i["3-PressureA"]),
type: "scatter",
mode: "lines"
},
{
name: "train_4",
x: data.filtrationData.map((i: any) => i["4-CumVol"]),
y: data.filtrationData.map((i: any) => i["4-PressureA"]),
type: "scatter",
mode: "lines"
}
].filter(({ name }) => plotOptions[name]);
return (
<Plot
data={plotData}
layout={{ width: 1000, height: 1000, title: "A Fancy Plot" }}
/>
);
} else {
return <h1>No Data Loaded</h1>;
}
}
}
export default FiltrationPlots;
источник
d ee((oent V[jkkncnt=kfay u skk==e>Ugs(< :ds b]uUeT eKne e=x>:dTy: lc,n=b;T=by>o[x oo<U yc ,t Ketgt )c)yo oe eTV aej ; Txb )t> se de esytkjeeUe otj]b j o:oebe)ytlT(eejfs>toyn> x
Я использую это:
interface IObjectKeys { [key: string]: string | number; } interface IDevice extends IObjectKeys { id: number; room_id: number; name: string; type: string; description: string; }
источник
При использовании
Object.keys
работает следующее:Object.keys(this) .forEach(key => { console.log(this[key as keyof MyClass]); });
источник
Когда мы делаем что-то вроде этого obj [key], Typescript не может точно знать, существует ли этот ключ в этом объекте. Что я сделал:
Object.entries(data).forEach(item => { formData.append(item[0], item[1]); });
источник
Без
typescript
ошибкиconst formData = new FormData(); Object.keys(newCategory).map((k,i)=>{ var d =Object.values(newCategory)[i]; formData.append(k,d) })
источник
Благодаря Алексу Маккею я решил динамически установить реквизит:
for(let prop in filter) (state.filter as Record<string, any>)[prop] = filter[prop];
источник
Я внес некоторые небольшие изменения в функцию / использование Alex McKay, которые, как мне кажется, упрощают понимание того, почему она работает, а также придерживаются правила « no-use-before-define» .
Сначала определите эту функцию для использования:
const getKeyValue = function<T extends object, U extends keyof T> (obj: T, key: U) { return obj[key] }
В том, как я это написал, общий для функции сначала перечисляет объект, а затем свойство объекта (они могут происходить в любом порядке, но если вы укажете
U extends key of T
доT extends object
того, как нарушитеno-use-before-define
правило, это также имеет смысл чтобы объект был первым, а его свойство - вторым. Наконец, я использовал более общий синтаксис функции вместо операторов стрелки (=>
).В любом случае, с этими модификациями вы можете просто использовать его так:
interface User { name: string; age: number; } const user: User = { name: "John Smith", age: 20 }; getKeyValue(user, "name")
Что, опять же, мне кажется более читаемым.
источник
Это то, что у меня сработало. У
tsconfig.json
него есть параметр,noImplicitAny
который был установленtrue
, я просто установил его,false
и теперь я могу получить доступ к свойствам в объектах с помощью строк.источник