Wypróbowuję TypeScript dla projektu React i utknąłem na tym błędzie:
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; }'
Który pojawia się, gdy próbuję przefiltrować tablicę w moim komponencie
.filter(({ name }) => plotOptions[name]);
Do tej pory przyjrzałem się artykułowi „Indeksowanie obiektów w TypeScript” ( https://dev.to/kingdaro/indexing-objects-in-typescript-1cgi ), ponieważ zawierał on podobny błąd, ale próbowałem dodać podpis indeksu do wpisz plotTypes
i nadal otrzymuję ten sam błąd.
Mój kod komponentu:
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;
źródło
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
Używam tego:
interface IObjectKeys { [key: string]: string; } interface IDevice extends IObjectKeys { id: number; room_id: number; name: string; type: string; description: string; }
źródło
Kiedy robimy coś takiego obj [klucz], Typescript nie może być pewien, czy ten klucz istnieje w tym obiekcie. Co ja zrobiłem:
Object.entries(data).forEach(item => { formData.append(item[0], item[1]); });
źródło
Podczas używania
Object.keys
działa:Object.keys(this) .forEach(key => { console.log(this[key as keyof MyClass]); });
źródło
Bez
typescript
błęduconst formData = new FormData(); Object.keys(newCategory).map((k,i)=>{ var d =Object.values(newCategory)[i]; formData.append(k,d) })
źródło
Dzięki Alexowi Mckayowi postanowiłem dynamicznie ustawić rekwizyty:
for(let prop in filter) (state.filter as Record<string, any>)[prop] = filter[prop];
źródło
Wprowadziłem kilka drobnych zmian w funkcji / użytkowaniu Alexa McKaya, które moim zdaniem ułatwiają śledzenie, dlaczego to działa, a także przestrzega zasady nieużywania przed zdefiniowaniem .
Najpierw zdefiniuj tę funkcję do użycia:
const getKeyValue = function<T extends object, U extends keyof T> (obj: T, key: U) { return obj[key] }
W sposób, w jaki to napisałem, generyczna funkcja wyświetla najpierw obiekt, a następnie właściwość obiektu (mogą one wystąpić w dowolnej kolejności, ale jeśli określisz
U extends key of T
przedT extends object
złamaniemno-use-before-define
reguły, to po prostu ma sens aby obiekt był pierwszy, a jego właściwość druga. Wreszcie, użyłem bardziej powszechnej składni funkcji zamiast operatorów strzałek (=>
).W każdym razie, z tymi modyfikacjami możesz go po prostu użyć w ten sposób:
interface User { name: string; age: number; } const user: User = { name: "John Smith", age: 20 }; getKeyValue(user, "name")
Co, znowu, uważam za nieco bardziej czytelne.
źródło
To właśnie zadziałało dla mnie.
tsconfig.json
Posiada opcjęnoImplicitAny
, że został ustawionytrue
, ja po prostu ustawić gofalse
i teraz mogę uzyskać dostęp do właściwości w obiektach wykorzystujących sznurki.źródło