I want to extend an interface for React props. But I get TS error Error:(19, 35) TS2304: Cannot find name 'T'.
1) Why error? <T>
is generic type. It can't be declared before usage.
2) Why TS throws error in my code but doesn't throw for DefinitelyTyped React types definitions here. Generic types <T>
and many others are used everywhere in their code. Why they do not throw?
3) How to extend it the right way?
Here is my code.
I import interface Props from 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>;
}
You either need to specify a concrete T
or declare a generic type parameter on the interface you are defining.
In react definitions the code works because they do define T
the <T>
after the interface is the definition for T
, so it can then be used inside the interface. When you define your own interface, you need to define your own type parameter T
and then forward if to Props
. This is what a version that defined T
would look like:
interface IHomeProps<T> extends Props<T> { }
// ^ T is defined ^ T is used
You probably want to just give a concrete type for T
:
interface IHomeProps extends Props<HTMLDivElement> { }
class Home extends PureComponent<IHomeProps> {
render() {
return <div></div>
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With