typescript - Belirli bir tür için birleştirme fonksiyonları koleksiyonunu yazmak


Eğer şöyle bir türüm varsa:

interface ITest {
  a: number;
  b: string;
  c: boolean;
}

Bir türün verilen bir özelliğini birleştirmek için bir 'fonksiyon koleksiyonu' olabilecek bir türü genel olarak tanımlayabilmeyi isterim.

Bir bireysel 'Birleşme'yi şöyle tanımlayabilirim:

type Merger<T, K extends keyof T> = (a: T[K], b: T[K]) => T[K];

Ama bunların tam bir koleksiyonuna sahip olabilmeyi düşünürdüm, örneğin:

const mergers: Mergers<ITest> = {
  a: (a: number, b: number) => a + b,   // should work with no error
  b: (a: string, b: number) => `${a}: ${b}`,    // this one should error
}

Bu yapılabilir mi?

Cevap #1

T anahtarları üzerinde işlem yapmak için sadece bir eşlenen tip kullanmanız yeterlidir. Parametreler için bağlamsal tipleri bile alacaksınız:

type Merger<T, K extends keyof T> = (a: T[K], b: T[K]) => T[K];
type Mergers<T> = {
  [P in keyof T]: Merger<T, P>
}

const mergers: Mergers<ITest> = {
  a: (a, b) => a + b,   // ok, contextualy typed a and b 
  b: (a: string, b: number) => `${a}: ${b}`,    // error
}

Oyun Alanı Bağlantısı