我为我的点击句柄函数编写了一个类型,它返回一个与其参数类型相同的值,代码是:
type OnClickHandle =<T extends unknown = undefined>(p: T extends infer U ? U : T)=>
T extends infer U ?
U extends number ? number:
U extends string ? string :
U extends undefined ?
void :
void :
void
然后我像这样定义了我的函数:
const handleReceive:OnClickHandle = (p:number) => p;
//ERROR:Type '(p: number) => number' is not assignable to type 'OnClickHandle'.
Types of parameters 'p' and 'p' are incompatible.
Type 'T extends infer U ? U : T' is not assignable to type 'number'.
Type 'unknown' is not assignable to type 'number'.
Type 'unknown' is not assignable to type 'number'.ts(2322)
handleReceive(0);
我对这条消息感到沮丧
'unknown' is not assignable to type 'number'
,我怎样才能让它运作良好?任何想法表示赞赏!
最佳答案
TLDR:我建议你使用以下
type OnClickHandle<T> = (p: T) => T;
const handleReceive: OnClickHandle<number> = (p: number) => p;
简单而有效。您的代码存在问题:
您正在尝试将具有具体类型的 lambda 分配给泛型函数
TS 中有 2 种泛型:
您不能将具有具体类型的 labmda 分配给泛型函数
type OnClickHandleGenericFunction = <T>(p: T) => T;
const handleReceiveGenFun1: OnClickHandleGenericFunction = (p: number) => p; //ERROR: number not assignable to T
您不太可能希望编写一个以相同方式处理任何类型 f 事件的处理程序,在这种情况下,您可以将泛型函数分配给泛型函数类型。const handleReceiveGenFun: OnClickHandleGenericFunction = <T extends any>(p: T) => p;
使用未知您收到的错误说您不能将 p 分配给未知数。
这并不奇怪。见 unknown
卷积类型推断
您无缘无故地引入了推断类型 U。
T extends infer U ?
U extends number ? number : void
可以换成T extends number ? number : void
关于javascript - typescript 类型 'unknown' 不可分配给类型 'number',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63482183/