Я хочу иметь тип/интерфейс, который включает в себя все свойства данного универсального типа и добавляет еще несколько, т.е. д., что расширяет его. Кроме того, я хочу иметь возможность «преобразовывать» любой объект этого типа в тот, который он расширяет.
Я никогда не буду создавать новый объект типа, который добавляет свойство, поскольку он будет действовать только как «контракт» для объекта. Таким образом, я предполагаю, что это никогда не должно быть классом.
До сих пор я пытался пересечь оба типа, например:
class MyClass{
prop1: string;
prop2: string;
constructor(){
this.prop1 = '1';
this.prop2 = '2';
}
}
type MyType<T> = T & {
additionalProp: string;
}
myService.getData()
.subscribe((res: MyType<MyClass>) => {
//Do something with res.additionalProp...
//This one should *not* have "additionalProp" yet it somehow does.
let anObject: MyClass = <MyClass>res;
console.info(anObject);
//output: {prop1: '1', prop2: '2', additionalProp: 'valuefromresponse'}
});
Может быть, это глупо с моей стороны, но я так и не понял, почему anObject
в моем примере все еще имеет свойство MyType
вводит.
Чтобы уточнить, я использую дженерики вместо прямого расширения MyClass
, чтобы иметь возможность повторно использовать контракт MyType
в коде.
Вы путаете тип времени выполнения с объявленным типом. Переменная anObject
содержит тот же фактический объект, что и res
, поэтому неудивительно, что журнал показывает это. Ваш слепок не имеет смысла - вы вводите в заблуждение машинопись о типе anObject
.
Спасибо за помощь, @Aleksey L. и @Tomasz Gawel. Я оставил MyType
то же самое и решил добавить следующее к MyClass
:
static fromObject<T extends MyClass>(o: T) {
return new MyClass(o.prop1, o.prop2);
}
Я знаю, что он использует статические методы и все такое, но это самое чистое решение, которое я мог придумать. Имея это, я могу вызвать let anObject: MyClass = MyClass.fromObject(res);
, решив обе проблемы своим оригинальным подходом.
Нет такой вещи, как литье в машинописном тексте.
<MyClass>
— это утверждение типа, и оно не влияет на объекты во время выполнения. Все типы стираются во время компиляции typescriptlang.org/docs/handbook/…