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 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
tests/cases/compiler/reverseMappedPartiallyInferableTypes.ts(91,20): error TS18046: 'k' is of type 'unknown'.
==== tests/cases/compiler/reverseMappedPartiallyInferableTypes.ts (1 errors) ====
// Repro from #30505
export type Prop<T> = { (): T }
export type PropType<T> = Prop<T>;
export type PropDefaultValue<T> = T;
export type PropValidatorFunction<T> = (value: T) => boolean;
export type PropValidator<T> = PropOptions<T>;
export type PropOptions<T> = {
type: PropType<T>;
value?: PropDefaultValue<T>,
required?: boolean;
validator?: PropValidatorFunction<T>;
}
export type RecordPropsDefinition<T> = {
[K in keyof T]: PropValidator<T[K]>
}
export type PropsDefinition<T> = RecordPropsDefinition<T>;
declare function extend<T>({ props }: { props: PropsDefinition<T> }): PropsDefinition<T>;
interface MyType {
valid: boolean;
}
const r = extend({
props: {
notResolved: {
type: Object as PropType<MyType>,
validator: x => {
return x.valid;
}
},
explicit: {
type: Object as PropType<MyType>,
validator: (x: MyType) => {
return x.valid;
}
}
}
})
r.explicit
r.notResolved
r.explicit.required
r.notResolved.required
// Modified repro from #30505
type Box<T> = {
contents?: T;
contains?(content: T): boolean;
};
type Mapped<T> = {
[K in keyof T]: Box<T[K]>;
}
declare function id<T>(arg: Mapped<T>): Mapped<T>;
// All properties have inferable types
const obj1 = id({
foo: {
contents: ""
}
});
// Some properties have inferable types
const obj2 = id({
foo: {
contents: "",
contains(k) {
return k.length > 0;
}
}
});
// No properties have inferable types
const obj3 = id({
foo: {
contains(k) {
return k.length > 0;
~
!!! error TS18046: 'k' is of type 'unknown'.
}
}
});
// Repros from #40809
type Mapped1<T> = {
[K in keyof T]: [T[K], (arg: T) => boolean];
};
declare function inferMapped1<T>(arg: Mapped1<T>): void;
inferMapped1({
key: [3, arg => arg.key > 5]
});
type Mapped2<T> = {
[K in keyof T]: [T[K], unknown extends T ? unknown : (arg: T) => boolean];
};
declare function inferMapped2<T>(arg: Mapped2<T>): void;
inferMapped2({
key: [3, arg => arg.key > 5]
});
type MappedReadonly<T> = {
readonly [K in keyof T]: readonly [T[K], (arg: T) => boolean];
};
declare function inferMappedReadonly<T>(arg: MappedReadonly<T>): void;
inferMappedReadonly({
key: [3, arg => arg.key > 5]
});
|