Skip to content

Instantly share code, notes, and snippets.

@mmitou
Created October 18, 2020 08:30
Show Gist options
  • Save mmitou/b21e991fcc37e77296b3dd7f1816d3b8 to your computer and use it in GitHub Desktop.
Save mmitou/b21e991fcc37e77296b3dd7f1816d3b8 to your computer and use it in GitHub Desktop.
type propertyValuType<T, Key, KeyOriginal> = Key extends keyof T
? KeyOriginal[] extends Key[]
? T[Key]
: never
: never;
type PropertyValueType<T, Key> = propertyValuType<T, Key, Key>;
type isPropertyKey<T, Key, KeyOriginal> = Key extends keyof T
? KeyOriginal[] extends Key[]
? true
: false
: false;
type IsPropertyKey<T, Key> = isPropertyKey<T, Key, Key>;
type AreSameType<T, U> = T extends U ? (U extends T ? true : false) : false;
function select<T extends object, K extends keyof T, L extends keyof T>(
obj: T,
k: IsPropertyKey<T, K> extends true
? AreSameType<T[K], T[L]> extends true
? K
: never
: never,
l: IsPropertyKey<T, L> extends true
? AreSameType<T[K], T[L]> extends true
? L
: never
: never
): [T[K], T[K]] {
return [obj[k], obj[l]] as any;
}
interface EventPayloads {
start: {
user: string;
};
stop: {
user: string;
after: number;
};
end: {};
}
class EventEmitter<E> {
emit<Ev extends keyof E>(eventName: Ev, payload: PropertyValueType<E, Ev>) {
console.log(eventName, payload);
}
}
interface FooFoo {
id: number;
name: string;
hoge: string;
}
function exampleFooFoo(): number {
const foo: FooFoo = { id: 1, name: "hello", hoge: "world" };
const x: [string, string] = select(foo, "name", "hoge");
console.log(x);
return 1;
}
exampleFooFoo();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment