Diğer bazı isteğe bağlı parametreleri atlarken isteğe bağlı parametreler nasıl iletilir?


282

Aşağıdaki imza verildiğinde:

export interface INotificationService {
    error(message: string, title?: string, autoHideAfter?: number);
}

Nasıl işlevini çağırabilirsiniz error() değil belirterek titleparametre, ancak ayar autoHideAftersöylemek 1000?

Yanıtlar:


307

Belgelerde belirtildiği gibi undefinedşunları kullanın :

export interface INotificationService {
    error(message: string, title?: string, autoHideAfter? : number);
}

class X {
    error(message: string, title?: string, autoHideAfter?: number) {
        console.log(message, title, autoHideAfter);
    }
}

new X().error("hi there", undefined, 1000);

Bahçesi bağlantısı .


6
@ BBi7 Sanırım belgeleri yanlış anladınız. ?Fonksiyon eklenir tanımı , ama soru aslında hakkındadır çağıran işlevi.
Thomas

Merhaba @Thomas Belgeleri tamamen anlıyorum ve eklemeniz gerektiğini biliyor musunuz? işlev tanımındaki parametreden sonra. Ancak, isteğe bağlı parametre (ler) ile bir işlevi çağırmayla ilgili olarak, tanımlanmamışsa geçerliliği kabul edilmezdim. Ben genel olarak isteğe bağlı parametre (ler) son parametre (ler) olarak yapmak için yollar bulmaya çalışıyorum böylece tanımsız vs geçemez. Ama açıkçası çok fazla varsa tanımsız veya doğru olmayan bir şey geçmeniz gerekir. Başlangıçta ne zaman geri gönderme ne emin değilim. Yani düzenlenmiş olup olmadığını bilmiyorum ama şimdi gördüklerim doğru.
BBi7

2
@ BBi7 Yakın zamanda düzenleme yapılmadı. Tamam, o zaman undefinedboş verin :) ( Argümanı tamamen terk etmekle aynı davranışı elde etmek için aslında geçmeniz gerektiğini unutmayın . Sadece "gerçek olmayan herhangi bir şey" işe yaramaz, çünkü TypeScript aslındavoid 0 daha güvenli bir yazma yöntemiyle karşılaştırır undefined. )
Thomas

71

Ne yazık ki TypeScript'te bunun gibi bir şey yok (daha fazla ayrıntı için: https://github.com/Microsoft/TypeScript/issues/467 )

Ancak bunun üstesinden gelmek için parametrelerinizi bir arayüz olacak şekilde değiştirebilirsiniz:

export interface IErrorParams {
  message: string;
  title?: string;
  autoHideAfter?: number;
}

export interface INotificationService {
  error(params: IErrorParams);
}

//then to call it:
error({message: 'msg', autoHideAfter: 42});

Lütfen söyleyebilir misiniz, bu şekilde hata yöntemini çağırabilir miyim, hata ({message: 'test'}), bence, yapamayız, bu yüzden hata ({message: 'test', autoHideAFter: undefined}), ancak ne bekliyorum hata (mesaj), diğer paramerler geçmedi, varsayılan parametrelerden değerleri almak shold.
Cegone

37

isteğe bağlı değişkeni ?veya ile isteğe bağlı birden fazla isteğe bağlı değişkeniniz varsa kullanabilirsiniz ...:

function details(name: string, country="CA", address?: string, ...hobbies: string) {
    // ...
}

Yukarıda:

  • name gerekli
  • country gerekli ve varsayılan bir değere sahip
  • address İsteğe bağlı
  • hobbies isteğe bağlı parametreler dizisidir

2
Hobiler bir dizi olarak yazılmamalı mı?
ProgrammerPer

4
Bu cevapta yararlı bir bilgi var, ancak soruya cevap vermiyor. Soru, gördüğüm gibi, birkaç isteğe bağlı parametreyi nasıl atlayabileceği / atlayabileceği ve sadece belirli olanları nasıl ayarlayabileceği.
MaxB

2
ülke zorunlu değildir, tanımsız yerine varsayılan 'CA' değerine sahip isteğe bağlı bir parametredir. gerekliyse, varsayılan değer sağlamanın anlamı nedir?
Anand Bhushan

19

Başka bir yaklaşım:

error(message: string, options?: {title?: string, autoHideAfter?: number});

Başlık parametresini atlamak istediğinizde, verileri şu şekilde gönderin:

error('the message', { autoHideAfter: 1 })

Diğerlerini göndermek zorunda kalmadan daha fazla parametre eklememe izin verdiği için bu seçenekleri tercih ederim.


Varsayılan değeri nasıl iletirsiniz title?
Dan Dascalescu

13

Bu neredeyse @Brocco'nun cevabı ile aynıdır, ancak hafif bir bükülme ile: bir nesnede yalnızca isteğe bağlı parametreleri iletin . (Ve ayrıca params nesnesini isteğe bağlı yapın).

Sonuçta Python'un ** kwarg'larına benziyor, ama tam olarak değil.

export interface IErrorParams {
  title?: string;
  autoHideAfter?: number;
}

export interface INotificationService {
  // make params optional so you don't have to pass in an empty object
  // in the case that you don't want any extra params
  error(message: string, params?: IErrorParams);
}

// all of these will work as expected
error('A message with some params but not others:', {autoHideAfter: 42});
error('Another message with some params but not others:', {title: 'StackOverflow'});
error('A message with all params:', {title: 'StackOverflow', autoHideAfter: 42});
error('A message with all params, in a different order:', {autoHideAfter: 42, title: 'StackOverflow'});
error('A message with no params at all:');

5

Arabirimde birden çok yöntem imzası belirtebilir ve ardından sınıf yönteminde birden çok yöntem aşırı yüklemesi yapabilirsiniz:

interface INotificationService {
    error(message: string, title?: string, autoHideAfter?: number);
    error(message: string, autoHideAfter: number);
}

class MyNotificationService implements INotificationService {
    error(message: string, title?: string, autoHideAfter?: number);
    error(message: string, autoHideAfter?: number);
    error(message: string, param1?: (string|number), param2?: number) {
        var autoHideAfter: number,
            title: string;

        // example of mapping the parameters
        if (param2 != null) {
            autoHideAfter = param2;
            title = <string> param1;
        }
        else if (param1 != null) {
            if (typeof param1 === "string") {
                title = param1;
            }
            else {
                autoHideAfter = param1;
            }
        }

        // use message, autoHideAfter, and title here
    }
}

Şimdi tüm bunlar işe yarayacak:

var service: INotificationService = new MyNotificationService();
service.error("My message");
service.error("My message", 1000);
service.error("My message", "My title");
service.error("My message", "My title", 1000);

... ve erroryöntemi INotificationServiceaşağıdaki seçeneklere sahip olacaktır:

Aşırı yük zekası

Oyun alanı


9
Ben sadece buna karşı tavsiye ve bunun yerine bir nesneye geçmek ve bu parametreleri o nesnenin özellikleri olarak koymak bir not ... çok daha az çalışma ve kod daha okunabilir olacaktır.
David Sherret

2

Hata argümanlarında bir nesne parametre tabanını kabul eden bir yardımcı yöntem oluşturabilirsiniz

 error(message: string, title?: string, autoHideAfter?: number){}

 getError(args: { message: string, title?: string, autoHideAfter?: number }) {
    return error(args.message, args.title, args.autoHideAfter);
 }

-1

Başlığı null olarak ayarlamayı deneyebilirsiniz.

Bu benim için çalıştı.

error('This is the ',null,1000)

3
Bu woulndt çalışır çünkü fonksiyon parametresine null gönderdiğinizde fonksiyon parametresi varsayılan bir değere sahipse varsayılan değerine ayarlanmaz
Okan SARICA

-2

Bunu bir arayüz olmadan yapabilirsiniz.

class myClass{
  public error(message: string, title?: string, autoHideAfter? : number){
    //....
  }
}

?operatörü isteğe bağlı bir parametre olarak kullanın .


ancak bu, herhangi bir şekilde belirtmenize izin vermez messageveautoHideAfter
Simon_Weaver

3
soruyu cevaplamıyorsunuz veya okumuyorsunuz. Sadece ikincisini girmek istiyorsa, ilk isteğe bağlı belirtmek zorunda kalmadan, birden fazla isteğe bağlı parametreli bir yöntemi nasıl çağıracağını bilmek istiyor.
Gregfr
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.