Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Optional class properties #8625

Merged
merged 11 commits into from
May 18, 2016
Merged

Optional class properties #8625

merged 11 commits into from
May 18, 2016

Conversation

ahejlsberg
Copy link
Member

@ahejlsberg ahejlsberg commented May 16, 2016

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
Copy link
Contributor

mhegazy commented May 16, 2016

can you add a declaration emit test.

@mhegazy
Copy link
Contributor

mhegazy commented May 16, 2016

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

@mhegazy
Copy link
Contributor

mhegazy commented May 16, 2016

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

@CreepGin
Copy link

CreepGin commented Jun 3, 2016

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

@mhegazy
Copy link
Contributor

mhegazy commented Jun 3, 2016

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

no, see #8126

@Roam-Cooper
Copy link

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
Copy link
Contributor

@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
Copy link

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

@bradenhs
Copy link

bradenhs commented Feb 24, 2017

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
Copy link

Venryx commented Mar 15, 2017

@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
Copy link

@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!

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

Successfully merging this pull request may close these issues.

None yet

8 participants