首先在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]
替换为T
或T[any]
似乎没有什么不同,但不能替换为T[string]
(为什么?)
[number]
之后的T
似乎不是索引。
答案 0 :(得分:1)
Array
使用index signature声明,如下所示:
interface ArrayMaybe<Element> {
[index: number]: Element;
}
(之所以称为ArrayMaybe
,是因为我没有特别复制Array
的声明,并且它没有任何关系。)
索引签名指示类型可以具有使用该类型的任何值作为键或索引的属性,但每个此类键/索引具有相同的值类型。因此ArrayMaybe<number>
的值可以为0
,1
,42
,依此类推,但是无论它具有这样的属性,该属性的值都将是number
从另一角度来看,在谈论某种类型T
时,T[____]
引用了T
的某些特定属性。因此{ foo: 'bar'; }['foo']
将引用类型'bar'
。在上面看到的索引签名的情况下,我们可以使用T[number]
来引用该索引签名的类型-在ArrayMaybe
的情况下,即Element
。正是您的示例中使用的方式。
您不能使用T[string]
,因为Array
没有字符串索引签名。您可以使用它们,但Array
不能使用。由于T[string]
没有字符串索引签名,因此不合法。不过,您可以使用T['length']
,因为Array
确实具有那个特别是字符串的属性。使用string
或number
表示任何字符串或数字-需要索引签名。
有关字符串索引签名的示例,请考虑
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 数组元素的类型