typescript - this.store.findRecod kullanırken tip kontrolünü nasıl düzeltebilirim
Ember.js projemde, javascript dosyalarını Typescript ve checkJs seçeneği ile tür kontrolü yapıyorum.
İşte basit bir route.js dosyası örneği
import Route from '@ember/routing/route';
export default class UsersRoute extends Route {
model() {
return this.store.findAll('user');
}
}
Bu kod ile aşağıdaki Typescript hatasını alıyorum
route.js:5:31 - error TS2345: Argument of type '"user"' is not assignable to parameter of type 'never'.
5 return this.store.findAll('user');
~~~~~~
Ember-data tür tanımlamaları @types/ember-data paketi tarafından sağlanır ve işte findAll tanımı
findAll<K extends keyof ModelRegistry>(
modelName: K,
options?: {
reload?: boolean;
backgroundReload?: boolean;
include?: string;
adapterOptions?: any;
}
): PromiseArray<ModelRegistry[K]>;
İşte findAll'in nasıl tanımlandığını araştırırken gidebildiğim kadar ilerleyişim.
Teorik olarak, this.store.findAll('user'); geçerlidir, ama bu Typescript hatasını düzeltmek için ne yapmalıyım?
Cevap #1
Ne olduğunu anlamak için ember-cli-typescript belgelerinin bu bölümünü okumanızı tavsiye ederim. Özetle, Ember için sağlanan tipler, this.findRecord('person', 1) yazdığınızda dönen şeyin bir Person olmasını (örneğin tanımladığınız DS.Model) sağlamak için ekstra bir iş yapar. Bunu çalıştırmak için, tipler bir "kayıt defteri" tanımlar — string isim ile geri döndürülecek tip arasındaki bir eşleme. Bu "kayıt defteri"nin boş olması, tiplerde gördüğünüz sorundur.
Ember-cli-typescript ile varsayılan yapılandırma, tsconfig.json içindeki paths anahtarını "*": "types/*" olarak ayarlayıp bu dosyayı <uygulama dizininiz>/types/ember-data/types/registries/model.d.ts konumuna ekleyerek bunu "sorunsuz çalışır" hale getirir:
/**
* Catch-all for ember-data.
*/
export default interface ModelRegistry {
[key: string]: any;
}
Bu, tüm model için dize aramalarının çalışmasını sağlamak için sadece tipin any olmasını gerektirir.
Eğer gerçekten türleri tanımlamak istiyorsanız, model türünü dışa aktaran user.js dosyasının hemen yanında bulunan bir user.d.ts dosyası oluşturmanız gerekecek ve bu dosya şunu içermeli:
declare module 'ember-data/types/registries/model' {
export default interface ModelRegistry {
'user': User;
}
}
Eğer zaten kullanıyorsanız, ember generate ember-cli-typescript çalıştırmak bunları sizin için güncelleyecektir. Ayrıca bu dosyayı belirtilen içeriklerle manuel olarak oluşturabilir ve paths haritalamasını ayarlayabilirsiniz (ve varsayılan şablondan diğer yol haritalarını da eklemek isteyebilirsiniz).
