打字稿代码中的T [number]是什么意思?

时间:2019-12-05 03:47:49

标签: typescript typescript-generics

首先在http://www.typescriptlang.org/docs/handbook/advanced-types.html#example-1

中找到了代码

,然后在打字稿代码库中找到以下类似代码: https://github.com/microsoft/TypeScript/blob/master/tests/cases/conformance/types/conditional/conditionalTypes1.ts#L75

type KnockoutObservable<T> = { object: T };
type KnockoutObservableArray<T> = { array: T };

type KnockedOut<T> = T extends any[] ? 
                       KnockoutObservableArray<T[number]> : 
                       KnockoutObservable<T>;

type KnockedOutObj<T> = {
    [P in keyof T]: KnockedOut<T[P]>;
}

代码中的T [number]是什么意思?

在“打字稿手册”示例中,

表示

  

数组的元素类型为T [number]

在操场上进行测试(仅用于测试)时,将T[number]替换为TT[any]似乎没有什么不同,但不能替换为T[string](为什么?)

[number]之后的T似乎不是索引。

2 个答案:

答案 0 :(得分:1)

Array使用index signature声明,如下所示:

interface ArrayMaybe<Element> {
    [index: number]: Element;
}

(之所以称为ArrayMaybe,是因为我没有特别复制Array的声明,并且它没有任何关系。)

索引签名指示类型可以具有使用该类型的任何值作为键或索引的属性,但每个此类键/索引具有相同的值类型。因此ArrayMaybe<number>的值可以为0142,依此类推,但是无论它具有这样的属性,该属性的值都将是number

从另一角度来看,在谈论某种类型T时,T[____]引用了T的某些特定属性。因此{ foo: 'bar'; }['foo']将引用类型'bar'。在上面看到的索引签名的情况下,我们可以使用T[number]来引用该索引签名的类型-在ArrayMaybe的情况下,即Element。正是您的示例中使用的方式。

您不能使用T[string],因为Array没有字符串索引签名。您可以使用它们,但Array不能使用。由于T[string]没有字符串索引签名,因此不合法。不过,您可以使用T['length'],因为Array确实具有那个特别是字符串的属性。使用stringnumber表示任何字符串或数字-需要索引签名。

有关字符串索引签名的示例,请考虑

interface Dictionary<Value> {
    [key: string]: Value;
}

这样,当T[string]T时,我们可以使用Dictionary,而T[string]将是Value。 / p>


总而言之,我个人更喜欢使用专用的环境类型来引用数组的元素,如下所示:

type ElementOf<T extends unknown[] | readonly unknown[]> = T[number];

然后,您可以只使用ElementOf<T>代替T[number]。我发现它比使用T[number]更具可读性和清晰度。

答案 1 :(得分:0)

似乎在这里可以找到基本的解释 https://www.typescriptlang.org/docs/handbook/2/conditional-types.html

<块引用>

当 Flatten 被赋予一个数组类型时,它使用带数字的索引访问来获取 string[] 的元素类型。否则,它只返回给定的类型。

# DEFAULT CACHE REGION
jcs.default=
jcs.default.cacheattributes=org.apache.commons.jcs.engine.CompositeCacheAttributes
jcs.default.cacheattributes.MaxObjects=100
jcs.default.cacheattributes.MemoryCacheName=org.apache.commons.jcs.engine.memory.lru.LRUMemoryCache
jcs.default.cacheattributes.UseMemoryShrinker=true
jcs.default.cacheattributes.MaxMemoryIdleTimeSeconds=3600
jcs.default.cacheattributes.ShrinkerIntervalSeconds=60
jcs.default.elementattributes=org.apache.commons.jcs.engine.ElementAttributes
jcs.default.elementattributes.IsEternal=true
jcs.default.elementattributes.MaxLife=21600
jcs.default.elementattributes.IdleTime=1800
jcs.default.elementattributes.IsSpool=true
jcs.default.elementattributes.IsRemote=true
jcs.default.elementattributes.IsLateral=true

###
jcs.region.tiles=
jcs.region.tiles.cacheattributes.MaxObjects=2

T[number] 将返回 T 数组元素的类型