我为我的单击句柄函数编写了一个类型,该函数返回一个与参数类型相同的值,代码为:
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'
,如何使它运作良好?
任何想法表示赞赏!
答案 0 :(得分:0)
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
答案 1 :(得分:0)
type Test<T> = (arg: T) => T;
这是一个普通的函数类型,其中的类型将从声明中推断
您可以像这样使用它
const test:Test<number> = (p:number) => p;
然后有办法
type Test = <T>(arg: T) => T;
这是一个泛型函数类型,其中该类型将从参数推断 您可以像这样使用它
const test:Test = (p) => p;
test(3) // type is inferred here
因此,如果我们不更改您的类型声明,则您的实现应如下所示
const handleReceive:OnClickHandle = (p) => p; // do not declare type here, it is supposed to be generic
handleReceive(3);