Кортеж подразумевает порядок. Свойства типа объекта не имеют определенного порядка. Как TypeScript узнает, что свойство должно быть go первым в AProps
?
Если вам нужен кортеж, вам нужно указать TypeScript, какой желаемый порядок.
type A = { a: string, b: string };
export const enumerate = <T>() =>
<U extends T[]>(...elements: WhenIncludesEvery<T, U>): U => elements;
type IncludesEvery<T, U extends T[]> =
T extends U[keyof U]
? true
: false;
type WhenIncludesEvery<T, U extends T[]> =
IncludesEvery<T, U> extends true
? U
: never;
const tuple = enumerate<keyof A>()('a', 'b'); // ["a", "b"]
type AProps = typeof tuple;
Это решение требует функция, которая вызывается во время выполнения, и является более сложной, но она гарантирует, что каждое свойство a) указано в списке b) указано только один раз.