Reactjs 使用通用React组件时,在TS 3.2+;
这段代码使用TypeScript 3.1.x编译得很好Reactjs 使用通用React组件时,在TS 3.2+;,reactjs,typescript,typescript3.0,Reactjs,Typescript,Typescript3.0,这段代码使用TypeScript 3.1.x编译得很好 从“React”导入React; 界面道具{ 错误:字符串; } 导出默认函数foo( ErrorCmp:React.ComponentType ) { return()=>{ 返回; } } 但如果我用TypeScript 3.2或更新版本编译它,我会 error TS2322: Type '{ error: string; }' is not assignable to type 'TErrorProps'. 这是TS 3.2中的
从“React”导入React;
界面道具{
错误:字符串;
}
导出默认函数foo(
ErrorCmp:React.ComponentType
) {
return()=>{
返回;
}
}
但如果我用TypeScript 3.2或更新版本编译它,我会
error TS2322: Type '{ error: string; }' is not assignable to type 'TErrorProps'.
这是TS 3.2中的回归还是3.2修复了我的代码所利用的漏洞
有趣的是,这段代码也无法在3.1中编译
interface IErrorProps {
error: string;
}
export default function foo<TErrorProps extends IErrorProps>(
ErrorCmp: (props: TErrorProps) => string
) {
return () => {
return ErrorCmp({ error: 'test error' });
}
}
打字脚本是正确的。考虑以下事项:
foo<{error: string, whatever: number}>(obj => `${obj.error} (${obj.whatever})`);
foo(obj=>`${obj.error}(${obj.whatever})`);
这在泛型的约束下是有效的,因为{error:string,whatever:number}
扩展了{error:string}
但您仅使用
error
键调用它。它几乎肯定是无效的。我在react apollo中使用ts 3.2+编译时遇到错误,我认为这是同一个问题。这似乎是一个相当糟糕的变化,所以我很惊讶没有发现太多的人点击这个。这是有道理的,似乎TS 3.2基本上修复了一个bug。谢谢
foo<{error: string, whatever: number}>(obj => `${obj.error} (${obj.whatever})`);