Skip to content

Symbols as literal types #7436

Closed
Closed
@Ciantic

Description

@Ciantic

Consider following use case for string literals at the moment in Flux:

interface IAction {
    actionType: string
}
interface ISayHelloAction extends IAction {
    actionType: "SAY_HELLO";
}

// Somewhere in your code you check that the message is ISayHelloAction from that actionType string using normal if

function processActions(action: IAction|ISayHelloAction|...) {
    if (action.actionType === "SAY_HELLO") {
        // action is ISayHelloAction
    }
}

(Above example assumes #6028 gets fixed, for the moment one can implement own type guard.)

But it would be even better if one could use Symbol for the same thing:

interface IAction {
    actionType: Symbol
}
const SAY_HELLO: Symbol = Symbol();

interface ISayHelloAction extends IAction {
    actionType: SAY_HELLO; // "Symbol literal type"
}

function processActions(action: IAction|ISayHelloAction|...) {
    if (action.actionType === SAY_HELLO) {
        // ... is ISayHelloAction
    }
}

These symbol literal types has same type guard requirement as literal types.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Needs ProposalThis issue needs a plan that clarifies the finer details of how it could be implemented.SuggestionAn idea for TypeScript

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions