Does TypeScript have a Null-conditional operator

前端 未结 6 1284
误落风尘
误落风尘 2020-12-11 00:10

Is there any operator like ?. in TypeScript that can check if the variable is null or not defined like Kotlin? Like

person?.getName()?.firstName ?: \"None\"
         


        
相关标签:
6条回答
  • 2020-12-11 00:13

    No, as of now safe navigation operatior is still not implemented in Typescript: https://github.com/Microsoft/TypeScript/issues/16

    However according to the latest standardization meeting notes it has been proposed, so maybe v3 :)

    https://github.com/tc39/agendas/blob/master/2017/07.md

    0 讨论(0)
  • 2020-12-11 00:19

    Actually this is related to javascript null safety discussion that is mentioned in this answer. I guess they want it to be supported on javascript before they will get to typescript.

    0 讨论(0)
  • 2020-12-11 00:20

    I've encountered the same situation, and the following worked for me.

    First, I defined a separate class with a property that can be null:

    export class Foo {
        id: number; //this can be null
    }
    

    Then in my main class I set a property foo to this new type:

    foo: Foo
    

    After that, I was able to use it like this:

    var fooId = (this.foo || ({} as Foo)).id;
    

    This is the closest I could get to have a null propagation in a current version of TypeScript.

    0 讨论(0)
  • 2020-12-11 00:28

    I used this in my code to check for null

    this.firstname = (this.firstname != null) ? this.firstname : this.firstname;
    

    This could do till v3 is out

    0 讨论(0)
  • 2020-12-11 00:32

    Yes, as of Typescript 3.7 you can now do this via optional-chaining

    person?.getName()?.firstName
    

    gets transpiled to

    let firstName = person === null || person === void 0 ? void 0 : (_person$getName = person.getName()) === null || _person$getName === void 0 ? void 0 : _person$getName.firstName;
    

    Note the check for null. This will work as expected if for example person is defined as

    let person:any = null; //no runtime TypeError when calling person?.getName()
    

    However if person is defined as

    let person:any = {};//Uncaught TypeError: person.getName is not a function
    

    See also this similar stackoverflow question

    0 讨论(0)
  • 2020-12-11 00:38

    The actual good answer is in Andreas' comment. Your example would be implemented as below from Typescript 3.7 onwards :

    person?.getName()?.firstName ?? "None"
    

    See https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#nullish-coalescing

    0 讨论(0)
提交回复
热议问题