包含数组的 API 响应的 TypeScript 声明

TypeScript declarations for API response containing an array

这是我的一段代码:

type Data = {
  data: Response;
}

type Response = {
  data: Cards[]; 
}

type Cards = {
  name: string;
}

class Editor extends Component<Props> {

  componentDidMount() {
    const { cardUnderEdition } = this.props;
    const description = cardUnderEdition && cardUnderEdition.currentCard.description;
    const currency = cardUnderEdition && cardUnderEdition.currentCard.name;

    fetch('https://api.coinmarketcap.com/v2/ticker') //eslint-disable-line
      .then(res => res.json())
      .then((data: Data) => this.setState({
        data: Object.values(data.data),
        description: cardUnderEdition === undefined
          ? ''
          : description,
        currentCurrency: cardUnderEdition === undefined
          ? Object.values(data.data)[0].name
          : currency,
      }));
   }

我在 Object.values(data.data)[0].name 中遇到错误 Property name does not exist on type {}
添加 "name" 属性 类型检查的正确方法是什么?

根据建议的更改,我得到 Property name does not exist on type Cards[]

您应该为您的 data -object

编写一个接口

例如

interface IData {
 data: IResponse
}

interface IResponse {
 name: string
}

// attach interface to data-obj
.then((data: IData) => ...

您还应该键入您的组件状态。

interface IProps { ... }
interface IState { ... }
class App extends React.Component<IProps, IState> {
...

按照您目前的设置方式,data.data 是一个 Response 对象,它仍然有一个 data 属性。 (如果将鼠标悬停在 IDE 中的第二个 data 上,您应该会看到它。) Object.values(data.data) returns [=] 的所有 属性 值的数组11=] 对象;此数组包含一个元素,它是 data 属性 的值,它本身是一个 Cards[]。使用 [0] 获取第一个元素后,您将得到一个 Cards[],它没有 name 属性.

我想您的意图是将回调的 data 参数声明为类型 Response 而不是 Data。然后 data.dataCards[] 类型, Object.values 是空操作,可以删除, Object.values(data.data)[0].name returns 第一张牌的名字。