Я пытаюсь передать keys
как опору React:
import * as React from "react";
import { render } from "react-dom";
const keys: string[] = ["a", "b"];
function App({keys}: string[]) {
return (
<div>
{keys.map((key: string) => (
<li>{key}</li>
))}
</div>
);
}
const rootElement = document.getElementById("root");
render(<App keys = {keys} />, rootElement);
Однако я получаю следующие ошибки:
Свойство map не существует для типа '() => IterableIterator'.
Тип 'string[]' нельзя присвоить типу '() => IterableIterator'.
Почему это и как это исправить?
Вы вводите весь реквизит как string[]
, а не просто keys
. Вставьте keys
prop в объект:
function App({ keys }: { keys: string[]; }) {
// ...
Или с помощью интерфейса:
interface AppProps {
keys: string[];
}
function App({ keys }: AppProps) {
// ...
Или типа:
type AppProps {
keys: string[];
}
function App({ keys }: AppProps) {
// ...
Чтобы пойти дальше: Различия между псевдонимами типов и интерфейсами
Спасибо. Интересно, а почему interface
, а не type
?
здесь нет реальной причины, кроме вдохновения момента ^^', оглядываясь назад, я бы сказал, потому что интерфейс расширяем... но типы могут каким-то образом расширяться с помощью пересечений, так что это тоже вариант. Добавляю в ответ ;)
Вы говорите, что
{keys}
относится к типуstring[]
, но это неправильно;{keys}
относится к типу{keys: string}
, как показано здесь . К сожалению, вы использовали свойство с тем же именем, что и у массивов; если бы вы изменили его на что-то другое , вы бы увидели проблему более прямо. Это полностью отвечает на ваш вопрос или я что-то упустил?