跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 请问 typescript 类型声明问题?
未分類
25 7 月 2019

请问 typescript 类型声明问题?

请问 typescript 类型声明问题?

資深大佬 : xiaoming1992 47

type TA = "typeA" type TB = "typeB" type TC = "typeC"  type HA = (arg: number) => void; type HB = (arg: string) => void; type HC = (arg: boolean) => void;  // 目的是为了实现下面这样类似的重载 // 但是感觉重载有些麻烦,万一类型多了,得写一堆,很烦 // 有什么办法通过泛型来表达吗? function func(type: TA, handler: HA): void; function func(type: TB, handler: HB): void; function func(type: TC, handler: HC): void; 

大佬有話說 (16)

  • 資深大佬 : wisebeer

    用 any

  • 主 資深大佬 : xiaoming1992

    @wisebeer 大佬!大佬![抱拳]

  • 資深大佬 : des

    泛型

  • 資深大佬 : EridanusSora

    type H<T> = (arg: T) => void;

    function funcA(type: TA, handler: H<string>): void;
    function funcB(type: TB, handler: H<number>): void;
    function funcC(type: TC, handler: H<boolean>): void;

  • 資深大佬 : codelegant

    TA | TB | TC 与 HA | HB | HC 之前可以通过操作关联起来吗?如果不行,就无法使用泛型。泛型就是用变量捕获类型的声明,然后重用。

  • 資深大佬 : wi

    interface TMap {
    “a”: (a: number) => any
    “b”: (b: number | string) => any
    “c”: (c: Date) => any
    }

    function fn2<T extends keyof TMap, F extends TMap[T]>(a: T, fn: F) {

    }

  • 資深大佬 : wi

    function fn3<T extends keyof TMap>(a: T, fn: TMap[T]) {

    }
    这个也可以

  • 主 資深大佬 : xiaoming1992

    @EridanusSora 我就是不想用重载啊…

    @wi 真·大佬!我一直在想前面的 T 怎么限定,大佬一个 extends 就解决了,感谢!

  • 資深大佬 : a132811

    @wi 请问这里怎么错了啊?

    “`
    $ cat a.ts
    interface TMap {
    “a”: (a: number) => any
    “b”: (b: number | string) => any
    “c”: (c: Date) => any
    }

    function fn2<T extends keyof TMap, F extends TMap[T]>(a: T, fn: F) {
    console.log(a, fn(1))

    }

    fn2(“a”,(a:number)=>a)
    ➜ ts$ git:(master) ✗
    $ tsc a.ts
    a.ts:8:27 – error TS2345: Argument of type ‘1’ is not assignable to parameter of type ‘number & Date’.
    Type ‘1’ is not assignable to type ‘Date’.

    8 console.log(a, fn(1))

    “`

  • 主 資深大佬 : xiaoming1992

    @a132811 你这个 fn(1),TMap[“c”]是不能接受 1 这个参数的啊。你是 abc 看懵了吧,把 fn2 里面的参数 a 改成 w 或者其他什么符号就清楚一点了

  • 資深大佬 : a132811

    @xiaoming1992 你没有看懵了,我确实是不明白。
    我的代码里面 fn 的类型就是 TMap[“a”]吧,也就是(a: number) => any 吧

    fn(1) 中 1 与 a:number 应该能匹配类型才对呀

  • 資深大佬 : a132811

    你没有看懵了-〉我没有看懵

  • 主 資深大佬 : xiaoming1992

    @a132811 TMap[“a”]确实没问题,可是 TMap[“c”]是有问题的啊。你在定义 fn2 的时候,console.log(a, fn(1)),不能 fn(1),因为 fn 可能只能接受 Date,你把函数的形参全部改成 w,就能发现自己哪里的问题了

  • 主 資深大佬 : xiaoming1992

    interface TMap {
    “a”: (w: number) => any
    “b”: (w: number | string) => any
    “c”: (w: Date) => any
    }

    function fn2<T extends keyof TMap, F extends TMap[T]>(w: T, fn: F) {
    // 这儿错了,不能直接调用 fn(1)
    // 当 w == “c”时,fn 不能接受 1 作为参数
    console.log(w, fn(1))
    }

    // 你看看,如果上面执行 fn(1)
    // 那你这么调用是不是就 errer 了?
    fn2(“c”, (w: Date) => w.getDate())

    // 手机打字好累…

  • 資深大佬 : a132811

    @xiaoming1992 感谢!
    我才想明白,我想成了把 fn:F 想成了执行时 `fn2(“a”, (n:number)=>n)` 才确定类型 为 number

    其实编译 typescript 时, fn:F 的类型就确定必须接受: number|string|Date,少一个都不行

    ps:程序员不要熬夜,熬夜太多了,脑子要坏

  • 主 資深大佬 : xiaoming1992

    @a132811 熬夜狗枯辣

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具