在Typescript中,<T>是什么意思?

Snorlax:
export declare function createEntityAdapter<T>(options?: {
    selectId?: IdSelector<T>;
    sortComparer?: false | Comparer<T>;
}): EntityAdapter<T>;

有人可以向我解释什么意思吗?我知道<>是类型断言,但我不知道是什么'T'如果有人可以向我解释此功能的作用,这也将有所帮助。

埃里克·飞利浦(Erik Philips):

有人可以向我解释什么<T>意思吗?

那就是打字稿泛型声明。

摘抄:

软件工程的主要部分是构建不仅具有良好定义和一致的API,而且还可以重用的组件。能够处理当今和未来数据的组件将为您提供构建大型软件系统的最灵活功能。

在C#和Java之类的语言中,用于创建可重用组件的工具箱中的主要工具之一是泛型,即能够创建一种可以在多种类型而不是单个类型上工作的组件。这使用户可以使用这些组件并使用自己的类型。

您提到:

我不知道什么是“ T”。

'T'将是在运行时而不是编译声明的类型T变量可以是任何未声明的变量(我找不到引用,但是我假设可以用于变量名称的任何有效字符集)。类似地,在,如果类型T表示的不是值类型而是更复杂的类型(类)或接口,则可以将其命名为/声明为TVehicleTAnimal帮助为将来的程序员表示有效的类型(并且可以被视为最佳实践,因为T不直观)。我更喜欢,TSomething因为我知道大写T表示泛型。WSometing还是ASomething有效的,但我不喜欢它。(Microsoft的API几乎总是TContext例如TEntity)。

如果有人可以向我解释此功能的作用,这也将有所帮助。

函数没有任何事情。这更多地声明了可以具有多个运行时类型值的函数类型。除了解释这些内容外,我还将直接摘录自上面链接的摘录。

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

可以像这样使用:

// type of output will be 'string'
let output = identity<string>("myString");  

要么

// type of output will be 'string', the compiler will figure out `T`
// based on the value passed in
let output = identity("myString");  

要么

// type of output will be 'number'
let output = identity(8675309);  

这可能是个问题:

为什么要使用泛型

Javascript有数组,但是当您从数组中检索一个值时,它实际上可以是任何东西(typescript:)any使用打字稿,您可以通过声明它们来获得打字安全性,例如:

 // Array<T>
 let list: number[] = [1, 2, 3];
 // or 
 let list: Array<number> = [1, 2, 3];

现在,数组中的每个值都有一个类型。如果您尝试将字符串放入此数组,Typescript将抛出编译时错误。当您检索一个值时,您将获得类型安全性和智能(取决于您的编辑器):

class Person {
  FirstName: string;
}

let people: Array<Person> = [];
people.push({ FirstName: "John" } as Person);

let john = people.pop();  
// john is of type Person, the typescript compiler knows this
// because we've declared the people variable as an array of Person

console.log(john.FirstName);  

声明类型的通用约束。开闭原理的一个很好的例子

在面向对象的程序设计中,开放/封闭原则指出“软件实体(类,模块,功能等)应该开放以进行扩展,而封闭以进行修改”; [1]也就是说,这种实体可以允许其行为无需修改其源代码即可进行扩展。

在以下示例中,任何人都可以扩展Human或Cheetah甚至创建自己的派生类型,并且Logger功能将继续工作而无需进行任何修改。

interface IAnimal {
  LegCount: number;
}

class Cheetah 
  implements IAnimal {
  LegCount: number = 4;
}

class Human
  implements IAnimal {
  LegCount: number = 2;
}

public class Logger<TAnimal extends IAnimal> {
  public Log(animal: TAnimal) {
    console.log(animal.LegCount);
  }
}

var logger = new Logger();
var human = new Human();
logger.Log(human);      

工作实例

在上一个示例中,我使用了通用约束来限制TAnimal程序员可以用来创建Logger实例的类型,这些实例可以从接口派生IAnimal这使编译器可以验证Logger类始终假定类型具有属性LegCount

您可以向我解释为什么在Typescript文档中使用<T>而不是使用诸如<Identity>这样更具描述性的内容。对我来说,没有什么和<T>一样。现在每个人都像傻瓜一样使用<T>,还是我错过了什么?

这些都是下面的假设。我既不知道设计打字稿通用系统的团队,也不知道编写文档的团队。

在泛型的根级别是使用能力T任何可能的类型(不要与打字原稿混淆any)。含义Array<T>接口(缺少更好的词),当我们创建具体类型时,我们将T其声明为类型:

Array<number>

那么对于接口而言, Array<T>还有什么比它更有意义的T呢?我不知道。我确实知道它T必须是Type(数字,字符串等),所以使用它是有意义的,T因为它是Type单词的第一个字母我认为Array<Type>如果typeType被保留或限制(目前type在某些情况下具有特殊含义,因此它也是一个错误的选择),这将真的造成混乱,并且甚至无效,因此避免使用它们是一个不错的选择。其他语言(C-sharpJava)也选择使用T,因此在语言之间切换并能够使用相同的术语是有利的。

另一方面,以下含义是什么?

Array<Identity>

这是Identity什么 没有帮助其他开发人员或将来的开发人员了解它是什么的约束。在我看来,这是一个必须明确实现的特定类型的数组,这意味着选择通用类型不由我决定。

interface Foo1 {
  bars: Array<Identity>;
}

在前面的示例中,我(可能还有大多数开发人员)将假定Identity是现有类型,并且无法更改它。

interface Foo2<T> {
  bars: Array<T>;
}

随着Foo2我知道我必须选择一个类型。

interface Foo3<Identity> {
  bars: Array<Identity>;
}

Foo3 只是令人困惑。

interface Foo4<TIdentity> {
  bars: Array<TIdentity>;
}

现在Foo4,我更加自信必须选择类型,但是我仍然对为什么感到困惑TIdentity显然,在某些情况下,如果类型更多定义,这将是有意义的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java中的“ Interface <T>”到底是什么意思?

什么是-?在TypeScript中是什么意思?

T &&(双“&”号)在C ++ 11中是什么意思?

TypeScript中的“环境”是什么意思

T-SQL中的老式JOIN语法是什么意思?

在Typescript中,“通用类型'Feature <T>'需要1个类型参数”是什么意思?

在Scala中“ T =:= Int = null”是什么意思?

“ @type t ::%__ MODULE __ {}”在Elixir中是什么意思

在winston v3中,T There <T>($ winstonLoggerConfig <T>)=> $ winstonLogger <T>是什么意思?

Typescript中的static是什么意思?

此类型声明中的{0:T}是什么意思?

使用L = T(*)(T);在template <typename T>中的(*)是什么意思?

“ ...” []在Typescript中是什么意思?

<T?>在类声明中是什么意思?

@(t)在Matlab中是什么意思?

JL在at&t语法中是什么意思?

$ T0在Swift中是什么意思?

这种表示法在Java中是什么意思?(比较器<?super T> c)

在Linux中,drwxrwxrwt。的d和t。是什么意思?

`。<T>`在Array。<T>`中是什么意思?

Ubuntu终端中的“ -t”是什么意思?

pod框架中t.column_name中的t是什么意思?

printf 文档中的“签名`size_t`”是什么意思?

{} 在 TypeScript 中是什么意思?

"-> !" 是什么意思 在 Rust 中的意思

Typescript 中语句“export type T1 = object & ComponentOptions<T1, T2>”的“&”是什么意思?

.T 在 np.vstack 函数中是什么意思?

<T = {}> 是什么意思?

XXX<U, in T: U> 在 kotlin 中是什么意思