如何在TypeScript中显式定义类型并在函数签名等中使用它

时间:2018-04-09 23:26:54

标签: typescript rxjs typescript-typings

我尝试按照以下官方指南编写自定义rxjs过滤器:

<?php

namespace api\modules\v1\controllers;

use yii\rest\Controller;

class BasicController extends Controller {

    public function actionTest() {
        return "oho";
    }

}

然而,在'T'类型中不存在'TS2339:属性'数据'。'

我通过使用'any'找到了解决方法:

const myFilter = (key: string) => <T>(source: Observable<T>) =>
  new Observable<T>(observer => {
    return source.subscribe({
      next(x) {
          x = x.data.values.find(item: => item.description === key);
          observer.next(x);
      },
      error(err) { observer.error(err); },
      complete() { observer.complete(); }
    });
  });

然而,寻找'myFilter'将理解'数据'对象的解决方案,因此可以使用点符号来访问x对象,而无需使用TypeScript错误和“任何”解决方法。

1 个答案:

答案 0 :(得分:2)

您需要使用Typescript的Generic Constraints功能。他们在文档中有一个非常相似的例子。

您需要使用界面。例如:

interface HasDataProp {
    data: DataType;
}

然后您需要在T上添加约束以限制允许使用的类型:

const myFilter = (key: string) => <T extends HasDataProp>(source: Observable<T>) =>