javascript - typescript 类型 'unknown' 不可分配给类型 'number'

标签 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' ,我怎样才能让它运作良好?
任何想法表示赞赏!

最佳答案

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/

    相关文章:

    javascript - 如何比较元素的 margin-left 与负值

    Javascript 类方法与属性

    javascript - 在 VueJS 中使用 Axios - 这个未定义

    javascript - TS : export default functional component

    javascript - 在 typescript 中导入 JSON 时如何禁用/断言/覆盖推断类型

    javascript - 如何在 setState 回调之外将 .map() val 和 key 渲染为 prop

    javascript - 在富文本编辑器中覆盖 IE 电子邮件自动格式设置

    javascript - Div 不完全等于具有继承值的父 div 的高度

    javascript - 如何在 chrome 控制台中保留该功能并在重新加载页面后运行它?

    typescript :如何将导入的图像包含在输出目录中?