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

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 关于 typescript 里的泛型(Generics),不太理解为什么要这么繁琐?
未分類
31 5 月 2020

关于 typescript 里的泛型(Generics),不太理解为什么要这么繁琐?

关于 typescript 里的泛型(Generics),不太理解为什么要这么繁琐?

資深大佬 : find456789 1

比如这一段代码:

function identity<T>(arg: T): T {     return arg; } 

为什么不写成这样呢?删掉 <T> 不是看上去更简单吗

function identity(arg: T): T {     return arg; } 

大佬有話說 (16)

  • 資深大佬 : abbycin

    你要写 cpp 还会看到 template<typename T> auto identify (T arg) -> T { return arg ; }

  • 資深大佬 : hua123s

    type T = {
    我还用不用了
    }

  • 資深大佬 : Aynamic

    图一你可以理解为 T 是一个未确定的类型,调用方法时候可以指明 T 的类型,图二 T 是一个已知的类型。

  • 資深大佬 : wysnylc

    也让你们体会下 Java 泛型带来的恐惧嘎嘎嘎

  • 資深大佬 : BingoXuan

    <>是声明泛型用的吧,例如<T,S>就声明泛型 T 和 S 可以用。

    我觉得 Python 的泛型声明才是最恶心的

  • 資深大佬 : eGlhb2Jhb2Jhbw

    你觉得编译器怎么知道你是想用泛型还是手残敲出了个未定义的类型?

  • 資深大佬 : jswh

    <T>里的 T 是声明,声明了之后后面才可以用鸭。

  • 資深大佬 : cxe2v

    微软的泛型最早出现在.NET 里面,.NET 泛型的定义里有个类型参数,类型参数就是用来给实际类型使用时候的占位符,创建泛型类的时候,需要将 T 替换成实际类型,例如
    “`c#
    public class identity{
    public T A<T>(T arg){
    return arg;
    }
    }

    identity I=new identity();
    I.A<int>(1);
    “`
    你看如果没有`<T>`这个类型参数的话,编译器无法在编译期间就检查类型错误,会导致不必要的类型转换和可能的类型错误,而 typescript 是微软的面向对象编程语言,在设计上会有同样的形式,所以你这里的这个`<T>`不能够省略的

  • 主 資深大佬 : find456789

    @jswh
    @BingoXuan
    @eGlhb2Jhb2Jhbw

    哦 谢谢,似乎有一些明白了

    冒昧再请教一下

    问题 1: 如果我不加<T>, 编译器 有可能以为 T 是一个自定义的 interface 或者 type 对吗?

    问题 2: 如果我加了 <T>, 就是 先告诉编译器,接下来的 T 是个泛型,而不是自定义 interfa 、type, 对吗

  • 資深大佬 : winnerczwx

    在 c#里可以这样简写

  • 資深大佬 : killergun

    看看 C#的泛型就知道了

  • 資深大佬 : Jirajine

    泛型就是把类型参数化,<T>的意思是接收一个类型作为参数,后面的 T 是在使用这个参数。就像一般的变量把数据参数化一样。

  • 資深大佬 : mxalbert1996

    主是不是以为泛型的类型只能用 T 表示?然而并不是。

  • 資深大佬 : CosimoZi

    有兴趣可以读点范畴论,对泛型的本质会有更深的理解.本质上像 lz 举例的带泛型的函数表达了自然变换(natural transformation),和一般的函数在数学意义上就不一样.

  • 資深大佬 : aguesuka

    java 里面可以这样调用泛型函数 identity<MyType>(param); 在 param 是 lambda 的时候,有时尖括号是不能省略的

  • 資深大佬 : BingoXuan

    @find456789
    是的,泛型是根据范型使用的上下文推断的类型。如果泛型声明时离开了使用上下文,那就没有意义了。所以需要通过<T,…>声明,并传递给上下文使用。

    如果不结合运用泛型的上下文来声明,糟糕的例子就是 python3 的泛型了。简直就只多此一举。代码量一多,泛型声明就被淹没 了。具体类型和泛型用起来一毛一样。如下代码,你完全不知道有没有用到泛型,如果提前声明 T 是类型 str,那么扔一个 int 其实会报类型不正确的。

    def Add(a:T,b:T)->T

文章導覽

上一篇文章
下一篇文章

AD

其他操作

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

51la

4563博客

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