javascript – 通用无状态组件的类型是什么?或者在typescript中扩展泛型函数接口以进一步通用?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 通用无状态组件的类型是什么?或者在typescript中扩展泛型函数接口以进一步通用?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1731字,纯文字阅读大概需要3分钟。
内容图文
问题:无状态功能组件的接口给出为
interface SFC<P = {}> {
(props: P & { children?: ReactNode }, context?: any): ReactElement<any> | null;
propTypes?: ValidationMap<P>;
}
我的组件的prop类型也是通用的:
interface Prop<V>{
num: V;
}
如何正确定义我的组件?如:
const myCom: <T>SFC<Prop<T>> = <T>(props: Prop<T>)=> <div>test</div>
在字符27处出现错误,找不到名称’T’
这是:Typescript Playground of modified example
MyFindings:
1:Typescript 2.9.1支持有状态通用组件:http://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-9.html#generic-type-arguments-in-jsx-elements
class myCom<T> extends React.Component<Prop<T>, any> {
render() {
return <div>test</div>;
}
}
2:扩展SFC以创建一个新接口,如下面的答案中所述,将使组件的prop类型为any:
Typescript React stateless function with generic parameter/return types我不想要.我想为我的道具提供合适的类型
解决方法:
你不能使用这样的泛型:
const myCom: <T>SFC<Prop<T>> = <T>(props: Prop<T>)=> <div>test</div>
TypeScript规范指出:
A construct of the form
06001
could be parsed as an arrow function expression with a type parameter or a type assertion applied to an arrow function with no type parameter.
source; Microsoft/TypeScript spec.md
您的声明与TypeScript规范中定义的模式不匹配,因此它不起作用.
但是,您可以不使用SFC接口,只需自己声明.
interface Prop<V> {
num: V;
}
// normal function
function Abc<T extends string | number>(props: Prop<T>): React.ReactElement<Prop<T>> {
return <div />;
}
// const lambda function
const Abc: <T extends string | number>(p: Prop<T>) => React.ReactElement<Prop<T>> = (props) => {
return <div />
};
export default function App() {
return (
<React.Fragment>
<Abc<number> num={1} />
<Abc<string> num="abc" />
<Abc<string> num={1} /> // string expected but was number
</React.Fragment>
);
}
内容总结
以上是互联网集市为您收集整理的javascript – 通用无状态组件的类型是什么?或者在typescript中扩展泛型函数接口以进一步通用?全部内容,希望文章能够帮你解决javascript – 通用无状态组件的类型是什么?或者在typescript中扩展泛型函数接口以进一步通用?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。