javascript - Typescript varsayılan/başlangıç argüman tipini alıp genişletmek için


Fonksiyon çağrılarına dayalı olarak otomatik tür ipuçları üreten bazı kodlar üzerinde çalışıyorum (GraphQL Nexus işleri).

Sonra, işlevlerinden birinde, otomatik olarak oluşturulan bu özelliklere dayalı anonim bir tür bekler:

export const Item = {
  isTypeOf(data) {  // data's type is an anonymous type, here it would be '{ name: string }'
    ...
  }
  definition(t) {
    t.string('name')
  }
}

Ancak bu data argümanı, definition içindeki fonksiyon çağrılarıyla tanımlananlardan daha fazla değişken içerecektir. Benim durumumda, data ayrıca bir kind özelliği de içeriyor.

Bu örnekte sadece { name: string, kind: string } kullanabilirim, ama gerçek kodum daha karmaşık nesneler içeriyor ve otomatik olarak oluşturulan tiplendirme şeylerinin tüm faydalarını kaybederim.

Anonim tip ile bir argümanı satır içinde genişletmenin bir yolu var mı? Bir argümanın kendi tipini almak için bir initial veya default anahtar kelimesi gibi bir şey düşünüyordum ve bunu şu şekilde kullanmak istiyordum:

isTypeOf(data: initial & { kind: string })
isTypeOf(data: default & { kind: string })

Cevap #1

Typescript, fonksiyona geçirilen nesnelerdeki ek anahtarlara aldırış etmez (parametre listesinden oluşturulmadıkları sürece).

Sadece belirli bir özelliğe sahip nesneleri kabul etmek ve bunu döndürmemek istiyorsanız, isTypeOf tanımını kullanın.

Aynı türü döndürmeniz ve muhtemelen genişletmeniz gerekiyorsa definition tanımını kullanın.

export const Item = {
  isTypeOf(data: { kind: string }): boolean {
    return data.kind == '...';
  },
  definition<T extends { string: (key: string): void }>(t): T & { defined: true } {
    t.string('name');
    (t as T & { defined: true }).defined = true;

    return t;
  },
};

const myType = {
  kind: 'hello',
  name: 'World',
  string(key: string): {},
};

Item.isTypeOf(myType); // OK
Item.isTypeOf({ kind: 'hello', name: 'World' }); // Not OK

Item.definition(myType); // OK
Item.definition({ string(key: string): {} }); // OK

İlgili makaleler