1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
|
=== tests/cases/compiler/inferentialTypingUsingApparentType3.ts ===
interface Field<T> {
>Field : Field<T>
>T : T
clean(input: T): T
>clean : (input: T) => T
>input : T
>T : T
>T : T
}
class CharField implements Field<string> {
>CharField : CharField
>Field : Field<T>
clean(input: string) {
>clean : (input: string) => string
>input : string
return "Yup";
>"Yup" : "Yup"
}
}
class NumberField implements Field<number> {
>NumberField : NumberField
>Field : Field<T>
clean(input: number) {
>clean : (input: number) => number
>input : number
return 123;
>123 : 123
}
}
class ObjectField<A, T extends { [name: string]: Field<any> }> {
>ObjectField : ObjectField<A, T>
>A : A
>T : T
>name : string
>Field : Field<T>
constructor(public fields: T) { }
>fields : T
>T : T
}
var person = new ObjectField({
>person : ObjectField<{}, { id: NumberField; name: CharField; }>
>new ObjectField({ id: new NumberField(), name: new CharField()}) : ObjectField<{}, { id: NumberField; name: CharField; }>
>ObjectField : typeof ObjectField
>{ id: new NumberField(), name: new CharField()} : { id: NumberField; name: CharField; }
id: new NumberField(),
>id : NumberField
>new NumberField() : NumberField
>NumberField : typeof NumberField
name: new CharField()
>name : CharField
>new CharField() : CharField
>CharField : typeof CharField
});
person.fields.id;
>person.fields.id : NumberField
>person.fields : { id: NumberField; name: CharField; }
>person : ObjectField<{}, { id: NumberField; name: CharField; }>
>fields : { id: NumberField; name: CharField; }
>id : NumberField
|