Saya ingin fungsi mengembalikan objek yang kuncinya sama dengan array kunci antarmuka yang diteruskan ke fungsi.

interface T { /* ...*/ }
func(keys: Array<keyof T>) => Object whose keys exactly match the argument `keys`.

Contoh:

interface Student {
  name: string;
  age: number;
  id: number;
}

const result = func(['name', 'age']);
result.name // ok
result.age // ok
result.id // should be an error

Inilah yang paling dekat yang saya dapatkan dengan kode aktual, tetapi tidak berhasil.

class PersonInfo { constructor(field: string){} }

type GetInfo<T> = (fields: Array<keyof T>) => Record<keyof T, PersonInfo>;

const getInfo: GetInfo<Student> = (fields: Array<keyof Student>): Record<keyof Student, PersonInfo> => {
  const result: Record<keyof Student, PersonInfo> = {}; // Compile error because it doesn't contain all keys of Student.
  for (const field of fields) {
    result[field] = new PersonInfo(field);
  }

  return result;
};

const info = getInfo(['name', 'age']);
info.name // ok
info.age // ok
info.id // should be an error, but it's not

Saya juga mencoba yang berikut ini, tetapi tentu saja tidak dapat dikompilasi karena keyof tidak dapat digunakan pada suatu nilai.

type GetInfo<T> = <U extends keyof T>(fields: Array<keyof T>) => { [key in keyof fields]: string };

Bagaimana saya bisa mereferensikan konten array yang diteruskan ke fungsi?

0
CookieMonster 30 Maret 2020, 01:37

1 menjawab

Jawaban Terbaik
interface Student {
  name: string;
  age: number;
  id: number;
}

function getInfo<T extends keyof Student>(keys: T[]): Pick<Student, T> {
  // your impl ..
}

const info = getInfo(['name']);

info.name; // ok
info.id; // TS2339: Property 'id' does not exist on type 'Pick<Student, "name">'.
0
AsukaSong 30 Maret 2020, 06:38