通用 TS 在这种情况下如何工作

Posted

技术标签:

【中文标题】通用 TS 在这种情况下如何工作【英文标题】:How generic TS works in this instance 【发布时间】:2021-12-06 04:39:26 【问题描述】:

我在网上遇到了以下代码,我对T 泛型如何发挥作用感到有些困惑。

代码如下所示:

interface TeamProps<T> 
   name: keyof T & string;
   league: string;


function Team<T>(
   name,
   league
: TeamProps<T>)
   .... React component

组件是这样使用的:

<Team name="Liverpool" league="Premier League" />

我看不到T 的定义位置以及keyof T 的来源。

谁能帮忙解释一下,如果需要更多信息,请告诉我。

【问题讨论】:

T 是从name 的值推断出来的,它必须是字符串 T 的键,所以在这种情况下T 是 Liverpool: any 。但是,如果没有更多上下文,很难说为什么使用泛型。 T 也不是PremierLeague 不,正如您从TeamProps 中看到的那样,league 属性和T 之间没有任何联系——只有name 属性必须是keyof T 实际上没有更多的代码/上下文,所以你认为这是不必要地添加泛型的情况还是增加了任何价值?是否增加了更多安全性? 大概T 不是在实际使用中被推断出来,并且表示将团队名称映射到其他数据的对象 - 在这种情况下,这会阻止使用团队该映射中不存在的名称。但是您甚至没有分享您正在查看的内容的链接,所以很难说。 【参考方案1】:

这取决于Team 是如何被调用/构造的。

考虑这个例子:

import React from 'react'

interface TeamProps<T> 
  name: keyof T & string;
  league: string;


function Team<T>(
  name,
  league
: TeamProps<T>) 
  return null


const ok = <Team< age: 42 > name='age' league='League' /> // ok

const error = <Team< age: 42 > name='Name' league='League' /> // expected error

const error2 = <Team< 2: 42 > name=2 league='League' /> // expected error, keys should be string

Playground

如果 Team 的调用方式与您在示例中的方式相同,但在 Team&lt; age: 42 &gt; 中没有显式泛型参数,则使用 T 没有任何意义。

【讨论】:

是的,我想如果它被不同地调用,但它的调用方式与我上面的示例相同 &lt;Team name="Liverpool" league="Premier League" /&gt; @peterflanagan 那么,这没有任何意义,甚至会造成伤害

以上是关于通用 TS 在这种情况下如何工作的主要内容,如果未能解决你的问题,请参考以下文章

异常处理,在这种情况下它是如何工作的

在这种情况下,链式赋值运算符如何工作 [重复]

Node.js async eachLimit 在这种情况下如何工作?

TS-- 类型推论类型兼容性高级类型

为啥使用?在这种情况下不工作? (迅速)

Codeigniter:这种情况下 csrf 不工作