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
|
// @strict: true
// @noEmit: true
// Repro from 53030
enum Type { A, B, C }
interface PayloadStructure {
dataType: Type;
data: unknown;
}
interface PayloadA extends PayloadStructure {
dataType: Type.A;
data: string;
}
interface PayloadB extends PayloadStructure {
dataType: Type.B;
data: number;
}
interface PayloadC extends PayloadStructure {
dataType: Type.C;
data: {
x: number;
y: number;
};
}
type Payload = PayloadA | PayloadB | PayloadC
type MappedPayload2 = {
[K in Type]?: (data: (Payload & { dataType: K })["data"]) => void
}
const payloads2: MappedPayload2 = {
[Type.A]: data => { console.log(data) }
}
// Additional repro from 53030
type GetPayload<P extends Payload, K extends keyof P> = P extends { dataType: K } ? P["data"] : never;
// Repro from #51161
type AnyOneof = { oneofKind: string; [k: string]: unknown } | { oneofKind: undefined };
type AnyOneofKind<T extends AnyOneof> = T extends { oneofKind: keyof T }
? T['oneofKind']
: never;
|