Учитывая интерфейс
interface Test {
inner: {
value: boolean,
}
}
и класс
class ContextualData<T> {
constructor(public data: T) {}
}
Я хотел бы иметь возможность сделать так:
const original: Test = {
inner: {
value: true,
},
}
// Wrap the value in a ContextualData object.
original.inner.value = new ContextualData<boolean>(original.inner.value)
Который я 'я пытаюсь достичь, объявив следующие типы:
export type Primitive = undefined | null | boolean | string | number | Function
export type Contextuable<T> = T | ContextualData<T>
export type DeepContextuable<T> =
T extends Primitive ? Contextuable<T> : DeepContextuableObject<T>
export type DeepContextuableObject<T> = {
[K in keyof T]: DeepContextuable<T[K]>
}
и затем используя DeepContextual
для преобразования моего Test
интерфейса:
const original: DeepContextual<Test> = {
inner: {
value: new ContextualData<boolean>(true),
},
}
Это прекрасно работает.
Теперь давайте добавим еще один метод к нашему ContextualData
классу:
class ContextualData<T> {
constructor(public data: T) {}
public map<U>(mapFn: (current: T) => U): U {
return mapFn(this.data)
}
}
Даже без использования новой функции наш контекстный интерфейс с value: ContextualData<boolean>(true)
теперь выдает следующую ошибку TS:
TS2322: Type 'ContextualData<boolean>' is not assignable to type
'boolean | ContextualData<true> | ContextualData<false>'.
Чего мне не хватает?Это ошибка?