'string'은 유형 '{}'을(를) 인덱싱하는 데 사용할 수 없습니다.
오브젝트 배열에서HTML 테이블을 생성하는 React 컴포넌트는 다음과 같습니다.표시할 열은 를 통해 정의됩니다.tableColumns
소유물.
루프 스루시items
올바른 컬럼을 표시하고 있습니다.key
로부터의 재산tableColumn
오브젝트({item[column.key]}
). 단, typescript에서 다음 오류가 발생합니다.
형식 'string' 식을 형식 '{}'을(를) 인덱싱하는 데 사용할 수 없으므로 요소에 암시적으로 '임의' 형식이 있습니다.유형 '{}'에서 매개 변수가 'string'인 인덱스 서명을 찾을 수 없습니다.
이 문제를 해결하려면 어떻게 해야 할까요?길을 잃었어요
컴포넌트 호출 방법:
<TableGridView
items={[
{
id: 1,
name: 'John Doe',
email: 'john@doe.de'
},
{
id: 2,
name: 'Lorem ipsum',
email: 'lorem@ipsum.com',
}
]}
tableColumns={[
{
key: 'id',
label: 'ID',
},
{
key: 'name',
label: 'Name',
}
]}
/>
마이 컴포넌트:
export type TableColumn = {
key: string,
label: string,
};
export type TableGridViewProps = {
items: object[],
tableColumns: TableColumn[]
};
const TableGridView: React.FC<TableGridViewProps> = ({ tableColumns, items }) => {
return (
<table>
<tbody>
{items.map(item => {
return (
<tr>
{tableColumns.map((column, index) => {
return (
<td
key={column.key}
className="lorem ipsum"
>
{item[column.key]} // error thrown here
</td>
);
})}
</tr>
);
})}
</tbody>
</table>
);
}
items: object[],
기술적으로는 JavaScript 오브젝트이지만 타입이 더 나을 수 있습니다.개체 속성에 액세스할 때 오류를 올바르게 식별하는 데 도움이 되는 유형 스크립트를 사용하려면 개체의 정확한 모양을 지정해야 합니다.라고 입력하면object
, typescript는 도움이 되지 않습니다.대신 개체의 정확한 속성 및 데이터 유형을 알 수 있습니다.
let assistance: { safe: string } = { safe: 1 /* typescript can now tell this is wrong */ };
assistance.unknown; // typescript can tell this wont really work too
오브젝트에 임의의 종류의 키/값 쌍이 포함될 수 있는 경우 오브젝트인덱스 타입을 사용하여 적어도 값(및 키)의 타입을 알 수 있습니다.
items: {
[key: string]: number | string,
}[]
그것이 주어진 경우의 정확한 유형입니다.
우선, 의 타입을 정의합니다.items
일렬로objects
타이프 스크립트의 목적에 어긋나기 때문에 좋지 않은 생각입니다.대신 어레이에 포함할 개체 유형을 정의합니다.저는 이렇게 하겠습니다.
type Item = {
id: number,
name: string,
email: string,
}
export type TableGridViewProps = {
items: Item[],
tableColumns: TableColumn[]
};
그 후, 만약 당신이 정말로 확신한다면key
존재하다item
다음 작업을 수행하여 유효한 인덱스에 액세스하고 있음을 Typescript에 알릴 수 있습니다.
<td
key={column.key}
className="lorem ipsum"
>
{item[column.key as keyof typeof Item]}
</td>
필드별로 유형 정의를 작성하는 것이 의미가 없고 클래스 정의로서 의미가 없는 현학적인 javascript 객체인 경우 다음과 같이 객체를 입력할 수 있습니다.any
및 typescript를 사용하면 원하는 대로 인덱스를 작성할 수 있습니다.
예를 들어,
//obviously no one with two brain cells is going to type each field individually
let complicatedObject: any = {
attr1: 0,
attr2: 0,
...
attr999: 0
}
Object.keys(complicatedObject).forEach(key => {
complicatedObject[key] += 1;
}
제네릭 사용
// bad
const _getKeyValue = (key: string) => (obj: object) => obj[key];
// better
const _getKeyValue_ = (key: string) => (obj: Record<string, any>) => obj[key];
// best
const getKeyValue = <T extends object, U extends keyof T>(key: U) => (obj: T) =>
obj[key];
Bad - 에러의 원인은object
type은 기본적으로 빈 개체일 뿐입니다.그렇기 때문에 이 명령어를 사용할 수 없습니다.string
색인화할 타이프{}
.
Better - 오류가 사라지게 된 이유는 컴파일러에 다음 명령을 전달하기 때문입니다.obj
인수는 문자열/값의 집합이 됩니다.(string/any
의 쌍). '아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아.any
더잘 、 도도록도도타 요세요요 。
- ★★★★★★★★★★★★★★」T
을 사용하다 U
를 T
.그러므로U
T
을 사용법
다음으로 완전한 예를 제시하겠습니다.
.U extends keyof T
보다 T extends object
범용 순서는 중요하지 않으며 기능에 가장 적합한 순서를 선택해야 합니다.
const getKeyValue = <U extends keyof T, T extends object>(key: U) => (obj: T) =>
obj[key];
interface User {
name: string;
age: number;
}
const user: User = {
name: "John Smith",
age: 20
};
const getUserName = getKeyValue<keyof User, User>("name")(user);
// => 'John Smith'
타입 any [ ]를 추가해 보겠습니다.
items:any[]
언급URL : https://stackoverflow.com/questions/57350092/string-cant-be-used-to-index-type
'programing' 카테고리의 다른 글
apache에서 nginx로: 워드프레스 다시 쓰기 규칙 (0) | 2023.03.28 |
---|---|
React App 만들기: index.html 환경변수를 사용합니다. (0) | 2023.03.28 |
ORA-12516, TNS: 리스너가 사용 가능한 핸들러를 찾을 수 없음 (0) | 2023.03.28 |
AWS 응용 프로그램에 대한 스프링 부팅 시작 오류: 사용 가능한 EC2 메타데이터가 없습니다. (0) | 2023.03.28 |
Axios - JSON 응답을 읽는 방법 (0) | 2023.03.23 |