En un proyecto personal, tengo un problema con los tipos condicionales de TypeScript. Tengo una comprensión básica de los tipos condicionales de los documentos de TypeScript. Espero que la configuración a continuación funcione, pero da un error de tipo.
Básicamente, estoy tratando de definir una interfaz para un nodo de árbol que se carga desde el disco. Esto significa que es posible que algunos de los nodos no se carguen correctamente debido a la falta de archivos, etc. Por lo tanto, cualquier implementación de nodo contiene Content o Error .
interface Content { data: number; } interface Error { code: string; } export interface TreeNode<T extends Content | Error> { getValue(): T extends Content ? number : string; } class ValueNode<ValueType extends Content> implements TreeNode<ValueType> { private readonly value: number; public constructor(value: number) { this.value = value; } public getValue(): number { return this.value; } } Esperaría que la implementación del método getValue pueda devolver string ya que la interfaz se implementa con el tipo que extiende Content . Pero me sale este tipo de error en lugar:
- La propiedad
getValueen el tipoValueNode<ValueType>no se puede asignar a la misma propiedad en el tipo baseTreeNode<ValueType>.
- Tipo
() => numberno se puede asignar a tipo() => ValueType extends Content ? number : string.
- El
numberde tipo no se puede asignar al tipoValueType extends Content ? number : string
Claramente, lo estoy haciendo de la manera incorrecta. ¿Cuál sería la forma correcta de lograr mi objetivo?
Como señaló @Dai, es mejor no sombrear el tipo de
Errorincorporado (para que pueda usarlo en su módulo).
Aquí hay dos alternativas:
interface ContentValue { data: number; } interface ErrorValue { code: string; } export interface ValueGetter<T> { getValue(): T; } class ValueNode<T extends ContentValue> implements ValueGetter<ContentValue['data']> { public constructor(private readonly value: T) {} public getValue(): number { return this.value.data; } } // or class SimpleValueNode<T extends ContentValue> { public constructor(private readonly value: T) {} public getValue(): number { return this.value.data; } }