export declare function createEntityAdapter<T>(options?: {
selectId?: IdSelector<T>;
sortComparer?: false | Comparer<T>;
}): EntityAdapter<T>;
有人可以向我解释什么意思吗?我知道<>
是类型断言,但我不知道是什么'T'
。如果有人可以向我解释此功能的作用,这也将有所帮助。
有人可以向我解释什么
<T>
意思吗?
那就是打字稿泛型声明。
摘抄:
软件工程的主要部分是构建不仅具有良好定义和一致的API,而且还可以重用的组件。能够处理当今和未来数据的组件将为您提供构建大型软件系统的最灵活功能。
在C#和Java之类的语言中,用于创建可重用组件的工具箱中的主要工具之一是泛型,即能够创建一种可以在多种类型而不是单个类型上工作的组件。这使用户可以使用这些组件并使用自己的类型。
您提到:
我不知道什么是“ T”。
'T'
将是在运行时而不是编译时声明的类型。该T
变量可以是任何未声明的变量(我找不到引用,但是我假设可以用于变量名称的任何有效字符集)。类似地,在c#中,如果类型T
表示的不是值类型而是更复杂的类型(类)或接口,则可以将其命名为/声明为TVehicle
或TAnimal
帮助为将来的程序员表示有效的类型(并且可以被视为最佳实践,因为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>
如果type或Type被保留或限制(目前type
在某些情况下具有特殊含义,因此它也是一个错误的选择),这将真的造成混乱,并且甚至无效,因此避免使用它们是一个不错的选择。其他语言(C-sharp,Java)也选择使用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] 删除。
我来说两句