打字稿类型“未知”不能分配给类型“数字”

时间:2020-08-19 07:40:48

标签: javascript typescript

我为我的单击句柄函数编写了一个类型,该函数返回一个与参数类型相同的值,代码为:

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',如何使它运作良好? 任何想法表示赞赏!

2 个答案:

答案 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);