ChatGPT解决这个技术问题 Extra ChatGPT

Typescript 参数名称中的问号是什么

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? 中的 ? 是做什么用的?


j
jcalz

是将参数标记为可选。

TypeScript 手册 https://www.typescriptlang.org/docs/handbook/2/functions.html#optional-parameters

TypeScript 深入了解 https://basarat.gitbook.io/typescript/type-system/functions#optional-parameters


我在变量名的末尾看到了 $ 符号。这意味着什么?
它与 TypeScript 无关。我在 RxJs 项目中看到过这样的语法。来自文档:这是“识别引用流的变量的通用 RxJS 约定”。 github.com/redux-observable/redux-observable/blob/master/docs/…
@SunilGarg $ 后缀通常是一种命名约定,表示变量是可观察的。
如果在类属性中使用问号怎么办?链接没有解决这个问题。
D
DvG

这是为了制作 Optional 类型的变量。否则,如果未使用此变量,则声明的变量将显示“未定义”。

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

我不同意它表示“可空”类型。它表示可选,不可为空。例如,上面示例中的 title 的值为 null 仍然有效,但对于声称实现 ISearchResult 的类在编译时缺少 entityName 属性将是无效的.
我认为正确的名称是“可选参数”。可空类型为 string?。要拥有一个可选的可为空值,您需要执行 name?: string?
@DvG 考虑到 Josh Gallagher 和 user276648 的评论,您介意改进您的答案吗?
@ user1460043 ..我已经更新了我的答案。谢谢你通知我
我假设措辞“可选类型”源自 c++、scala 或 python 等语言。如果你有一个通用的 Optional<T>类型。实际上,将 ? 放在类型规范之后而不是变量名之后会更有意义。如果您不向 lookupId 传递任何内容,那么它将没有类型 string
M
Masih Jahangiri

参数?:类型是参数的简写:类型|不明确的

那么有什么区别?问号表示“可选”。
更准确地说,parameter?: type 等于 parameter: type | undefined = undefined


不完全是。问号表示“可选”。所以它是“参数:类型|未定义=未定义”的简写。
实际上,它并不默认为 undefined,而是默认为不存在。 Masih 的回答是正确的:parameter?: typeparameter: type | undefined 的简写,请注意 = undefinedthis example 中的行为有何不同。
@lodewykk 这也不完全是简写。 param?: type 将参数声明为可选,param: type | undefined 不声明。示例:const foo: { a?: string } = {} 有效,但 const foo: { a: string | undefined } = {} 失败。同时,在函数声明中@mcoolive 是对的,arg?: type 等价于 arg: type | undefined = undefined,比较 stackoverflow.com/questions/37632760/…
W
Willem van der Veen

参数中的 ? 表示可选参数。 Typescript 编译器不需要填写此参数。更多详细信息请参见下面的代码示例:

// baz: number | undefined means: the second argument baz can be a number or undefined

// = undefined, is default parameter syntax, 
// if the parameter is not filled in it will default to undefined

// Although default JS behaviour is to set every non filled in argument to undefined 
// we need this default argument so that the typescript compiler
// doesn't require the second argument to be filled in
function fn1 (bar: string, baz: number | undefined = undefined) {
    // do stuff
}

// All the above code can be simplified using the ? operator after the parameter
// In other words fn1 and fn2 are equivalent in behaviour
function fn2 (bar: string, baz?: number) {
    // do stuff
}



fn2('foo', 3); // works
fn2('foo'); // works

fn2();
// Compile time error: Expected 1-2 arguments, but got 0
// An argument for 'bar' was not provided.


fn1('foo', 3); // works
fn1('foo'); // works

fn1();
// Compile time error: Expected 1-2 arguments, but got 0
// An argument for 'bar' was not provided.