错误:(19,35)TS2304:找不到名称“ T”。为什么我不能在TS中扩展接口?

时间:2019-07-01 12:12:51

标签: reactjs typescript generics

我想扩展React道具的接口。但是我收到TS错误错误:(19,35)TS2304:找不到名称'T'。

1)为什么出错? <T>是通用类型。不能在使用前声明。

2)为什么TS会在我的代码中引发错误,但不会为DefinitelyTyped React types definitions here引发错误。通用类型<T>和许多其他类型在其代码中随处使用。他们为什么不扔?

3)如何正确扩展它?

这是我的代码。

我从DefinitelyTyped for React导入了界面道具

import React, {Props, PureComponent} from 'react';

// TS throws Error:(20, 27) TS2304: Cannot find name 'T'.
interface IHomeProps extends Props<T> { }

class Home extends PureComponent<IHomeProps> {
  render() {
    ...
  }
}

// interface Props definition
    interface Props<T> {
        children?: ReactNode;
        key?: Key;
        ref?: LegacyRef<T>;
    }

2 个答案:

答案 0 :(得分:3)

您需要指定具体的T或在要定义的接口上声明泛型类型参数。

在React定义中,代码之所以有效,是因为它们确实在接口是T的定义之后定义了<T> T,因此可以在接口内部使用。定义自己的接口时,需要定义自己的类型参数T,然后将其转发到Props。这是定义T的版本的样子:

interface IHomeProps<T> extends Props<T> { }
                 //  ^ T is defined   ^ T is used

您可能只想为T提供一个具体类型:

interface IHomeProps extends Props<HTMLDivElement> { }

class Home extends PureComponent<IHomeProps> {
    render() {
        return <div></div>
    }
}

答案 1 :(得分:0)

简单函数示例。只需扩展ObjectLiteral类型即可。

之前:

private filterNull(data: Array<any>) {
    return data.filter(x => !!x);
}

之后:

private filterNull<T extends ObjectLiteral>(data: Array<T>): Array<T> {
    return data.filter(x => !!x);
}