Для чего нужен знак вопроса в имени параметра Typescript


179
export class Thread {
  id: string;
  lastMessage: Message;
  name: string;
  avatarSrc: string;

  constructor(id?: string,
              name?: string,
              avatarSrc?: string) {
    this.id = id || uuid();
    this.name = name;
    this.avatarSrc = avatarSrc;
  }
}

Для id?чего ??

Ответы:


207

Он должен пометить параметр как необязательный .


6
Я видел символ $ в конце имен переменных. Что это значит?
Сунил

12
Это не связано с TypeScript. Я видел такой синтаксис в проектах RxJs. Из документа: это «общее соглашение RxJS для определения переменных, которые ссылаются на поток». github.com/redux-observable/redux-observable/blob/master/docs/…
Фидан Хакай

3
@SunilGarg $ postfix - это обычно соглашение об именах, означающее, что переменная является наблюдаемой.
java-addict301

30

Это должно сделать переменную необязательного типа. В противном случае объявленные переменные показывают « undefined », если эта переменная не используется.

export interface ISearchResult {  
  title: string;  
  listTitle:string;
  entityName?: string,
  lookupName?:string,
  lookupId?:string  
}

1
Я не согласен, что это указывает на «обнуляемый» тип. Это указывает на необязательный, не обнуляемый. Например, titleв приведенном выше примере все еще допустимо иметь значение, nullно оно будет недопустимым для класса, который утверждает, что реализует, ISearchResultчто отсутствует entityNameсвойство во время компиляции.
Джош Галлахер

8
Я думаю, что правильное имя «необязательный параметр». Обнуляемый тип будет string?. Чтобы иметь необязательный nullable, вы бы сделали name?: string?.
user276648

@DvG Не могли бы вы улучшить свой ответ, учитывая комментарии Джоша Галлахера и пользователя 276648?
user1460043

@ user1460043 .. Я обновил свой ответ. Спасибо, что
сообщили

Я предполагаю, что формулировка «необязательный тип» происходит от таких языков, как c ++, scala или python. Где у вас есть универсальный необязательный тип <T>. На самом деле, было бы более разумно ставить ?после спецификации типа, а не после имени переменной. Если вы ничего не передадите lookupId, то это не будет иметь тип string.
Марти Нито

13

parameter?: type это сокращение для parameter: type | undefined


2
Не совсем. Вопросительный знак означает «необязательно». Так что это сокращение для «параметр: тип | undefined = undefined» ..
mcoolive
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.