Typescript中的可选类成员

Typescript中的可选类成员,typescript,Typescript,有没有办法在Typescript类中指定类型安全的可选成员 就是说,有点像 class Foo { a?: string; b?: string; c: number; } .... foo = new Foo(); ... if (foo.a !== undefined) { ... (access foo.a in a type-safe string manner) ... } 如果您熟悉OCaml/F#,我正在寻找类似“字符串选项”的内容。TypeScrip

有没有办法在Typescript类中指定类型安全的可选成员

就是说,有点像

class Foo {
    a?: string;
    b?: string;
    c: number;
}

....

foo = new Foo();
...
if (foo.a !== undefined) { ... (access foo.a in a type-safe string manner) ... }

如果您熟悉OCaml/F#,我正在寻找类似“字符串选项”的内容。

TypeScript 3.x中的以下工作:

class Foo {
  a?: string;
  b?: string;
  c: number = 123;
}

请注意,您需要初始化任何非可选的成员(如图所示的内联成员或构造函数中的成员)。

在某些用例中,您可以通过以下方式完成:


可选类属性作为功能添加到Typescript 2.0中

在此示例中,属性b是可选的:

class Bar {
  a: number;
  b?: number;
}

可选属性和方法现在可以在类中声明,类似于接口中已经允许的内容:

class Bar {
    a: number;
    b?: number;
    f() {
        return 1;
    }
    g?(): number;  // Body of optional method can be omitted
    h?() {
        return 2;
    }
}
在--strictNullChecks模式下编译时,可选属性和方法的类型中自动包含未定义的属性和方法。因此,上面的b属性的类型为number |未定义,而上面的g方法的类型为(()=>number)|未定义。类型防护装置可用于去除类型的未定义部分:

function test(x: Bar) {
    x.a;  // number
    x.b;  // number | undefined
    x.f;  // () => number
    x.g;  // (() => number) | undefined
    let f1 = x.f();            // number
    let g1 = x.g && x.g();     // number | undefined
    let g2 = x.g ? x.g() : 0;  // number
}

有没有办法避免定义可选属性?(
{a:asdf',b:nada'}
而不是
{a:asdf',b:nada',c:undefined}
另外,我得到的
提供的字符与TypeScript游戏场上调用目标的任何签名都不匹配,在VS中,此答案已过时,或者至少升级了TypeScript 2.7以来默认不起作用的内容。此答案已过时,或者至少升级了TypeScript 2.7以来默认不起作用的内容。自TS 2.7以来,您将ld get
属性“c”没有初始值设定项,也没有在构造函数中明确指定。
这是对代码的正确回答,说明必须定义
Foo#c
,但它不是安全初始化的。答案已更新,并与最新的TypeScript版本一起使用,而这在理论上可能回答了这个问题,在这里包括答案的基本部分,并提供链接供参考。根据您的反馈进行修改:)有趣。我使用的是TS 4,如果我添加,它会给我意外的令牌错误?在类定义中。界面似乎让它很难。
function test(x: Bar) {
    x.a;  // number
    x.b;  // number | undefined
    x.f;  // () => number
    x.g;  // (() => number) | undefined
    let f1 = x.f();            // number
    let g1 = x.g && x.g();     // number | undefined
    let g2 = x.g ? x.g() : 0;  // number
}