使用代码中声明的接口属性时出现错误。即使代码正确,为什么还会出现错误?

时间:2020-08-02 19:06:07

标签: reactjs typescript

在此代码中,我声明了一个标为Row的接口。我在代码中进一步使用了属性,但是会引发错误。

代码-

import { ServerRespond } from './DataStreamer';

export interface Row {
  price_abc: number,
  price_def: number,
  ratio: number,
  timestamp: Date,
  upper_bound: number,
  lower_bound: number,
  trigger_alert: number | undefined,
}


export class DataManipulator {
  static generateRow(serverResponds: ServerRespond[]): Row[] {
    const priceABC = (serverResponds[0].top_ask.price + serverResponds[0].top_bid.price) / 2;
    const priceDEF = (serverResponds[1].top_ask.price + serverResponds[1].top_ask.price) / 2;
    const ratio = priceABC / priceDEF;
    const upperBound = 1 + 0.05;
    const lowerBound = 1 + 0.05;
    return {
        price_abc: priceABC,
        price_def: priceDEF,
        ratio,
        timestamp: serverResponds[0].timestamp > serverResponds[1].timestamp ?
          serverResponds[0].timestamp : serverResponds[1].timestamp,
        upper_bound: upperBound,
        lower_bound: lowerBound,
        trigger_alert: (ratio > upperBound || ratio < lowerBound) ? ratio : undefined,
      };
  }
}

错误-

Type error: Type '{ price_abc: number; price_def: number; ratio: number; timestamp: Date; upper_bound: number; lower_bound: number; trigger_alert: number | undefined; }' is not assignable to type 'Row[]'.
  Object literal may only specify known properties, and 'price_abc' does not exist in type 'Row[]'.  TS2322
  • 我尝试卸载然后再次安装打字稿。
  • 我尝试安装几次需要的节点模块。

我无法解决问题。

2 个答案:

答案 0 :(得分:1)

由于要返回数组(Row [])([]表示要返回该对象的数组),但只​​返回单个对象,因此必须适应这一点。 像这样(您只返回行):

 static generateRow(serverResponds: ServerRespond[]): Row { // The [] are removed so you only return a single object
    const priceABC = (serverResponds[0].top_ask.price + serverResponds[0].top_bid.price) / 2;
    const priceDEF = (serverResponds[1].top_ask.price + serverResponds[1].top_ask.price) / 2;
    const ratio = priceABC / priceDEF;
    const upperBound = 1 + 0.05;
    const lowerBound = 1 + 0.05;
    return {
        price_abc: priceABC,
        price_def: priceDEF,
        ratio,
        timestamp: serverResponds[0].timestamp > serverResponds[1].timestamp ?
          serverResponds[0].timestamp : serverResponds[1].timestamp,
        upper_bound: upperBound,
        lower_bound: lowerBound,
        trigger_alert: (ratio > upperBound || ratio < lowerBound) ? ratio : undefined,
      };
  }

要么这样(您只返回行数组):

 static generateRow(serverResponds: ServerRespond[]): Row[] {
    const priceABC = (serverResponds[0].top_ask.price + serverResponds[0].top_bid.price) / 2;
    const priceDEF = (serverResponds[1].top_ask.price + serverResponds[1].top_ask.price) / 2;
    const ratio = priceABC / priceDEF;
    const upperBound = 1 + 0.05;
    const lowerBound = 1 + 0.05;
    return [{ // Here is the array wrapper around so you return an array with one entry
        price_abc: priceABC,
        price_def: priceDEF,
        ratio,
        timestamp: serverResponds[0].timestamp > serverResponds[1].timestamp ?
          serverResponds[0].timestamp : serverResponds[1].timestamp,
        upper_bound: upperBound,
        lower_bound: lowerBound,
        trigger_alert: (ratio > upperBound || ratio < lowerBound) ? ratio : undefined,
      }]; // And here with ] you close the array
  }

答案 1 :(得分:1)

在我看来,您实际上是在指定函数正在返回Row[] [Row, Row, Row],而实际上它正在返回Row {price_abc: ''...}。因此,您应该将功能调整为以下界面:

static generateRow(serverResponds: ServerRespond[]): Row {...

代替Row[]