Typescript 中的泛型为什么要用<T>、<U>..等符号,是什么的简写吗?

2017-11-26 21:33:31 +08:00
 think2011
10732 次点击
所在节点    JavaScript
27 条回复
kfll
2017-11-26 23:20:36 +08:00
T: type
U: 在字母表中处于 T 下一位

猜测。
lihongjie0209
2017-11-26 23:28:56 +08:00
当你在前端遇到任何不理解的问题去后端找找就清楚了, 毕竟都是借鉴(chao)后端的
lrz0lrz
2017-11-26 23:41:49 +08:00
@lihongjie0209 那么后端为什么要这样做呢?
think2011
2017-11-26 23:57:59 +08:00
@lihongjie0209 求后端指导
hanai
2017-11-27 00:02:50 +08:00
@kfll 说的对,看 https://docs.oracle.com/javase/tutorial/java/generics/types.html 的 Type Parameter Naming Conventions 部分
SuperMild
2017-11-27 00:07:42 +08:00
说沿用 Java 也对,但其实根据英语习惯和编程习惯,也很容易做出这样的设定,比如用了变量 i,那还需要一个临时变量时就会按顺序用 j,k
AngelCriss
2017-11-27 00:11:04 +08:00
template<typename F, typename Arg>

    struct is_type_match

    {

      private:

        template<typename Func> struct extract;


        template<typename R, typename A>

        struct extract<R(A)>

        {

          using ires = R;

          using iarg = A;

        };


        template<typename R, typename A>

        struct extract<R(*)(A)> : extract<R(A)> {};


        template<typename R, typename A>

        struct extract<std::function<R(A)>> : extract<R(A)> {};


        template<typename R, typename Class, typename A>

        struct extract<R(Class::*)(A)> : extract<R(A)> {};


        template<typename R, typename Class, typename A>

        struct extract<R(Class::*)(A) const> : extract<R(A)> {};


        template<typename R, typename Class, typename A>

        struct extract<R(Class::*)(A) volatile> : extract<R(A)> {};


        template<typename R, typename Class, typename A>

        struct extract<R(Class::*)(A) const volatile> : extract<R(A)> {};


        template<typename lambda>

        struct extract : extract<decltype(&lambda::operator())> {};


        template<typename lambda>

        struct extract<lambda&> : extract<decltype(&lambda::operator())> {};


        template<typename lambda>

        struct extract<lambda&&> : extract<lambda&> {};

      public:

        using arg = typename std::remove_cv<

          typename std::remove_reference<Arg>::type>::type;

        using iarg = typename std::remove_cv<

          typename std::remove_reference<typename extract<F>::iarg>::type>::type;

        constexpr static bool arg_same = std::is_same<arg, iarg>::value;

    };

-------------------
比如这里面 F 代表 function,A,Arg 代表参数,R 代表返回值,Class 代表类,lambda 代表匿名类。。
geelaw
2017-11-27 00:13:07 +08:00
其实我的习惯是 T1, T2, TIt, TForwardIt, ...TArgs, TFunc, TPred, TKey, TValue
sunjourney
2017-11-27 00:22:59 +08:00
@lihongjie0209 Typescript 作者是 C# 的作者,你说是抄?井底之蛙
kojirou
2017-11-27 00:24:21 +08:00
爱用什么用什么。。
Gonejack
2017-11-27 00:36:00 +08:00
这东西随便定,Java 里还有 K V 表示 key value,T R 表示参数和返回
FaiChou
2017-11-27 09:29:06 +08:00
swift 中大多也是 T, U, V, Element...
overflowHidden
2017-11-27 09:30:15 +08:00
@sunjourney 官方借鉴就是名正言顺地抄袭而已啊
think2011
2017-11-27 10:08:10 +08:00
E - Element (used extensively by the Java Collections Framework)
K - Key
N - Number
T - Type
V - Value
S,U,V etc. - 2nd, 3rd, 4th types

@hanai 找到啦

谢谢各位!
KuroNekoFan
2017-11-27 10:27:49 +08:00
看一下 java 基础就知道了
sunjourney
2017-11-27 10:50:38 +08:00
@overflowHidden #13 您脑回路特别清奇,自己抄自己?
overflowHidden
2017-11-27 10:57:12 +08:00
@sunjourney 我这说的抄袭是照搬的意思,因为搬得太生硬
sunjourney
2017-11-27 10:57:45 +08:00
@overflowHidden #13 而且泛型很多语言都有,把类、接口、枚举、全拿掉好了
sunjourney
2017-11-27 11:03:55 +08:00
@overflowHidden #17 用 T,U 是照搬还是 TypeScript 有泛型是照搬?官方文档里举的例子用 T, U 是因为是要在举例抽象的例子,swift, haskell 都是这么用,就不生硬了?实际项目都是和语义关联的,想用什么就用什么。
bramblex
2017-11-27 11:12:04 +08:00
@lihongjie0209

这东西关后端屁事?

别说那群写 java / php 的, 你就写 c++ 后端的, 模板折腾懂了吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/409721

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX