2017-06-07 70 views
7

İlk öğesi belirli bir tür (ör. İşlev) olan bir dizi için bir tür tanımlamak istiyorum ve kalan öğeler şunlardır: boş tip Örneğin:Typescript'te, ilk öğenin kalanından daha spesifik olan bir dizi için bir tür tanımlayın

Böyle bir şey mümkün mü?

amacı böyle bir tek argüman fonksiyonunu sağlamaktır:

const myCaller = (fun: Function, args: any[]) => fun.apply(args); 

fakat estetik nedenlerle:

const myCaller = ([fun, ...args]: FAs) => fun.apply(args); 

alternatif bir yaklaşım, bu gibi myCaller iki parametre kullanmak olacaktır Tek bir argüman kullanmayı tercih ederim. Ayrıca, tip sisteminin tartışmalı olarak keyfi uzunluktaki bir tupeyi destekleyip desteklemediğini merak ediyorum. Belki de bilgisayar bilimi için anlamıyorum, anlamıyorum.

+0

Alakalı: https://github.com/Microsoft/TypeScript/issues/212 –

cevap

6

Eğer

type FAs = [Function, {}]; 

tanımlarsak sonra tip FAs değerleri bir tip Function birinci elemanı, tip {} bir ikinci elemanı ve Function | {} bir sonraki elemanları gerektirir. TypeScript edebi dizi türleri böyle çalışır. Gönderen TS docs:

bilinen endekslerin grubu dışındaki unsurunu erişen bir birlik türü yerine kullanılır: Bu olacağı gerçeği haricinde sen istediğiniz her şeyi yapmalıdır

dizinin üçüncü öğesi vb. gibi bir Function -tipli değerinde geçiş yapabilir. Ama aslında bu durum zaten Function{} ile uyumludur.

Bunun etrafında hiçbir yolu yoktur. TS'de, ilk n öğelerinin belirli bazı tür (ler) olduğu bir dizi türü tanımlamak için bir yolu yoktur ve diğer belirli bir türden geriye kalan sayıda rastgele öğe vardır.

Ayrıca, tür sisteminin isteğe bağlı uzunluklu bir tuple olanı destekleyip desteklemediğini merak ediyorum.

Aslında tür sistemi sadece rasgele uzunlukta dizilerini destekler. Eğer

type Tuple = [number, number]; 

derseniz bu tip numaralarını içeren uzunluğunda iki veya daha fazla olan herhangi bir dizi ile uyumlu.Eğer

type Tuple = [string, number]; 

derseniz bu tip uzunluğu, herhangi bir dizi ile uyumlu ilk element olarak bir dize, ikinci olarak bir dizi ve üçüncü olarak bir dize veya sayı ya sahip iki veya uzun, vb. "Bilgisayar bilimi temelli" bu davranışın nedenlerini aramadım; Bu, TS'nin kontrol etmesi için mümkün olan şeyin bir meselesi.

alternatif bir yaklaşım

interface Arglist { 
    [index: number]: object; 
    0: Function; 
} 

const a1: Arglist = [func]; 
const a2: Arglist = [22];     // fails 
const a3: Arglist = [func, "foo"];   // fails 
const a4: Arglist = [func, obj]; 
const a5: Arglist = [func, obj, obj]; 
+0

Hiçbir fikrim yoktu. Tipcript, bu belge sayfasını bir çok kez okumanıza rağmen, bilinen indeks seti dışındaki elemanlar için bir sendika türü kullanacaktı. Açık bir açıklama ve belgelere bağlantı için teşekkür ederiz. – anticrisis

0

Eminim bu, Typescript 2.3'ten yapabileceğiniz en iyisi. Örneğin, bu tip yazı tiplerini görebilirsiniz.

interface IMyCaller { 
    <R>([fn]: [() => R]): R; 
    <R,A>([fn, a]: [(a: A) => R, A]): R; 
    <R,A,B>([fn, a, b]: [(a: A, b: B) => R, A, B]): R; 
    <R,A,B,C>([fn, a, b, c]: [(a: A, b: B, c: C) => R, A, B, C]): R; 
    // keep adding these until you get tired 
} 

const myCaller: IMyCaller = ([fun, ...args]) => fun.apply(args); 
+0

Bu ben de düşündüm ama elementler için birlik tiplemesinin typescript kullanması değil özellikle ne tanımlanmış çok faydalıdır. Önemli bir uyarının yanı sıra önemli bir uyarı için kabul edilen cevaba bakın. – anticrisis

+0

Haklısınız, sıkı yazmaya ihtiyacınız yoksa yardımcı olabilir. Sanırım taşındım ve soruna çok fazla dikkat etmedim :) – dbandstra