我知道這個問題可能不太清楚,但是對于這樣抽象的案例,很難用詞組表達問題并找到答案,老實說,我不知道如何更好地表達。
我有以下代碼:
enum TagType {
SIMPLE = 'simple',
COLLECTOR = 'collector',
}
interface Tag {
type: TagType,
}
interface SimpleTag extends Tag {
type: TagType.SIMPLE,
}
interface CollectorTag extends Tag {
type: TagType.COLLECTOR,
}
interface ServiceDefinition<T extends Tag> {
tags: T[],
}
// This works.
const definition: ServiceDefinition<Tag> = {tags: []};
const collectorTags: CollectorTag[] = definition.tags.filter((t: Tag): t is CollectorTag => t.type === TagType.COLLECTOR);
// This doesn't work.
class CollectorDefinitionProcessor <T extends Tag> {
process(definition: ServiceDefinition<T>): void {
const collectorTags: CollectorTag[] = definition.tags.filter((t: T): t is CollectorTag => t.type === TagType.COLLECTOR);
}
}
操場
為什么類中的代碼是錯誤的?我們如何像上面那樣在泛型類中區分這個陣列的專案?
uj5u.com熱心網友回復:
發生這種情況是因為definition.tags可以包含列舉中定義的所有型別的標簽。您可以像這樣顯式地將 CollectorTags 轉換為您想要的型別:
class CollectorDefinitionProcessor<T extends Tag> {
process(definition: ServiceDefinition<T>): void {
const collectorTags: CollectorTag[] = definition.tags.filter(
(t: T) => t.type === TagType.COLLECTOR
) as CollectorTag[]
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/356472.html
上一篇:檢測嵌套型別的泛型
