Conversation

ahejlsberg

This PR makes it possible to declare optional properties and methods in classes, similar to what is already permitted in interfaces. For example:

class Bar {
    a: number;
    b?: number;
    f() {
        return 1;
    }
    g?(): number;  // Body of optional method can be omitted
    h?() {
        return 2;
    }
}

When compiled in --strictNullChecks mode, optional properties and methods automatically have undefined included in their type. Thus, the b property above is of type number | undefined and the g method above is of type (() => number) | undefined. Type guards can be used to strip away the undefined part of the type:

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
}

@@ -16,8 +14,6 @@ tests/cases/conformance/types/objectTypeLiteral/methodSignatures/objectTypesWith

class C {
x?: number; // error
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

comments are out of date now.

@mhegazy

can you add a declaration emit test.

@mhegazy

can you also add a test with --strictNullchecks and an optional parameter property declaration, e.g. constructor(private a?: number) { }

@mhegazy

also another one for extending classes, making optionals non-optional, and making non-optionals optional.

@CreepGin

@ahejlsberg Nice job! Just curious, can decorators fetch information that can determine whether the target is declared optional?

@mhegazy

can decorators fetch information that can determine whether the target is declared optional?

no, see #8126

@Roam-Cooper

Optional class properties don't seem to work for abstract properties in typescript 2.0.3, subclasses of the abstract class are forced to implement the property.

@aluanhaddad

@Roam-Cooper that's the point of the abstract modifier, to require that an implementation is provided by a subclass. If it's optional you don't have to override it meaning it should not be abstract.

@Roam-Cooper

Ah, yes, wasn't thinking straight! My bad. 😃

@bradenhs

Does this PR enable making class getters optional? I can't figure out how to mark getters as optional. I have no idea where the question mark would go.

@Venryx

@bradenhs I have the same question. Would be nice for my situation, where I want to make a custom derived class (which has getters) compatible with the base class definition/type-shape.

@bradenhs

@Venryx I made an issue for this (#14417) but it was shot down. I don't think the guy reviewing the issue fully understood what I was getting at. You could create another issue and give a better explanation of the problem though. If you do let me know!

@microsoftmicrosoft locked and limited conversation to collaborators Jun 19, 2018
Sign up for free to subscribe to this conversation on . Already have an account? Sign in.
None yet
None yet

Successfully merging this pull request may close these issues.