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

This comment has been minimized.

Copy link
@mhegazy

mhegazy May 16, 2016

comments are out of date now.

@mhegazy
Copy link

mhegazy commented May 16, 2016

can you add a declaration emit test.

@mhegazy
Copy link

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

mhegazy commented May 16, 2016

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

@ahejlsberg ahejlsberg added this to the TypeScript 2.0 milestone May 18, 2016
@ahejlsberg ahejlsberg merged commit 9a22d08 into master May 18, 2016
2 checks passed
2 checks passed
continuous-integration/travis-ci/pr The Travis CI build passed
Details
continuous-integration/travis-ci/push The Travis CI build passed
Details
@ahejlsberg ahejlsberg deleted the optionalClassProperties branch May 18, 2016
@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

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

Roam-Cooper commented Oct 2, 2016

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

aluanhaddad commented Oct 2, 2016

@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

Roam-Cooper commented Oct 3, 2016

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

bradenhs commented Mar 15, 2017

@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.
Projects
None yet
Linked issues

Successfully merging this pull request may close these issues.

None yet

8 participants
You can’t perform that action at this time.