Suppose I have interface
interface X {
a: string;
b: number;
c: boolean;
}
and a function
function values(x: X) {
You can:
interface X {
a: string;
b: number;
c: boolean;
[key: string]: X[keyof X];
}
The result of X[keyof X] will now be (string | number | boolean), which works even better than any because the return of your function will be (string | number | boolean)[].
Example
Another way that should work with both examples is:
function values(x: X) {
const keys = Object.keys(x) as (keyof X)[];
return keys.map(s => x[s]);
}
Not pretty, but at least more typed than (x as any).
Of course it can be made generic too:
function values(x: T) {
const keys = Object.keys(x) as (keyof T)[];
return keys.map(s => x[s]);
}