TypeScript Arabirimleri, özellikler için birlikte oluşum kısıtlamalarını ifade edebilir
Monolitik bir Typcript Interface veya Type tanımları içinde özelliklerin birlikte göründüğünü veya hiç görünmediğini iddia eden standart bir model var mı?
Örneğin bir öğe böyle görünse geçerli olabilir ...
{
id:"ljklkj",
spellcheck:true,
spellcheckModel:"byzantine",
}
...veya bu...
{
id:"ljklkj",
}
Ancak, yazım denetimi özelliklerinden herhangi biri tek başına gerçekleşirse geçersiz olur.
{
id:"ljklkj",
spellcheckModel:"byzantine",
}
{
id:"ljklkj",
spellcheck:true,
}
Monolitik
Elbette yukarıdaki basit durum, bir Veri ve Yazım Denetimi Veri Türü veya Arayüzü oluşturularak çözülebilir. Ancak benim uygulama durumumda, birden fazla birlikte meydana gelen özelliklerin 'kümesi' olacaktır. Her birlikte oluşma kombinasyonu için yeni bir tür tanımlamak, durumu ifade etmek için türlerin patlamasına yol açacaktır.
Bu nedenle çözüme 'monolitik' bir arayüz olarak atıfta bulundum. Elbette, onu tanımlamak için bir tür kompozisyon kullanmak gerekli olabilir.
Ne Denedim
Typescript dil referansı içinde buna benzer örnekler bulmaya çalıştım, ancak özelliğin ne denilebileceğini bilmeden (ya da gerçekten ifade edilebilecek bir özellikse), mücadele ediyorum. Özellikler ayrı ayrı isteğe bağlı olabilir, ancak birlikte oluşu ifade etmenin bir yolunu göremiyorum.
İlgili Teknolojiler
XML veri doğrulaması için eşdeğer bir özellik burada tartışılmaktadır ... https://www.w3.org/wiki/Co-occurrence_constraints
JSON için, Schematron ve Json İçerik Kuralları gibi şema dillerinin ortak kısıtlamaları ifade edebildiğini anlıyorum.
Çalışılan örnek
Solr arama motoru için HTTP parametre setlerine uygulanan ortak kısıtlama durumu için typcript sözdizimi düşünseydim, bu şöyle görünebilir, bu da Yazım veya Grup parametrelerini tam olarak karşılamayı seçebileceğinizi veya hiç yapmayacağınızı gösterir - her türün isteğe bağlı olduğu bir birleşim ( ? ile gösterilir ) ...
type SolrPassthru =
SolrCoreParams & (
SolrSpellParams? |
SolrGroupParams?
)
Bu, doğru Typescript olduğuna inandığım, ancak her parametre grubundan TÜM parametreleri gerektiren aşağıdaki örnekle çelişiyor.
type SolrCoreParams = {
defType: SolrDefType,
boost: SolrBoostType,
}
type SolrSpellParams = {
spellcheck: "true" | "false",
"spellcheck.collate": "true" | "false",
"spellcheck.maxCollationTries": 1,
}
type SolrGroupParams = {
group: "true" | "false",
"group.limit": '4'
"group.sort": 'group_level asc,score desc,published desc,text_sort asc'
"group.main": 'true'
"group.field": 'group_uri'
}
type SolrPassthru =
SolrCoreParams &
SolrSpellParams &
SolrGroupParams
Yanıtlar
Lütfen aşağıdakileri deneyin. Doğru yerlerde hataları gösteriyor gibi görünüyor.
type None<T> = {[K in keyof T]?: never}
type EitherOrBoth<T1, T2> = T1 & None<T2> | T2 & None<T1> | T1 & T2
interface Data {
id: string;
}
interface SpellCheckData {
spellcheck: boolean,
spellcheckModel: string,
}
// Two interfaces
var z1: EitherOrBoth<Data, SpellCheckData> = { id: "" };
var z2: EitherOrBoth<Data, SpellCheckData> = { spellcheck: true, spellcheckModel: 'm'};
var z3ERROR: EitherOrBoth<Data, SpellCheckData> = { spellcheck: true};
var z4: EitherOrBoth<Data, SpellCheckData> = { id: "", spellcheck: true, spellcheckModel: 'm'};
interface MoreData {
p1: string,
p2: string,
p3: string,
}
type Monolith = EitherOrBoth<Data, EitherOrBoth<SpellCheckData, MoreData>>
var x1: Monolith = { id: "" };
var x2: Monolith = { spellcheck: true, spellcheckModel: 'm'};
var x3ERROR: Monolith = { spellcheck: true};
var x4: Monolith = { id: "", spellcheck: true, spellcheckModel: 'm'};
var x5ERROR: Monolith = { p1: ""};
var x6ERROR: Monolith = { p1: "", p2: ""};
var x7: Monolith = { p1: "", p2: "", p3: ""};
var x8: Monolith = { id: "", p1: "", p2: "", p3: ""};
var x9ERROR: Monolith = { id: "", spellcheck: true, p1: "", p2: "", p3: ""};
var x10: Monolith = { id: "", spellcheck: true, spellcheckModel: 'm', p1: "", p2: "", p3: ""};
Oyun alanı bağlantısı
Güncelleme
Türleri bir demet olarak geçirmeyi tercih ederseniz, aşağıdaki yardımcı programı kullanabilirsiniz:
type CombinationOf<T> = T extends [infer U1, infer U2] ? EitherOrBoth<U1, U2> :
T extends [infer U1, infer U2, infer U3] ? EitherOrBoth<U1, EitherOrBoth<U2, U3>> :
T extends [infer U1, infer U2, infer U3, infer U4] ? EitherOrBoth<U1, EitherOrBoth<U2, EitherOrBoth<U3, U4>>> :
never;
type Monolith = CombinationOf<[Data, SpellCheckData, MoreData]>
Bazı özellikler gerekliyse:
type Monolith = Data & CombinationOf<[Data, SpellCheckData, MoreData]>