microsoft / microsoft/TypeScript
Allow more constructs to work as type guards for `unknown`
Nobody has claimed this yet.
- Dominant language
- Go
- Stars
- 111k
- Forks
- 14.3k
- Avg merge
- 2d 4h
- Merged PRs (30d)
- 132
Description
Search Terms
unknown type guard
Related: https://github.com/Microsoft/TypeScript/pull/24439#issuecomment-394185089, https://github.com/Microsoft/TypeScript/issues/25172
Suggestion
Currently, only a very limited set of type guards are able to narrow the new unknown type:
- Array.isArray (because it is a typeguard for
arg is any[]) and probably some more in the lib files - instanceof
- self-written typeguards
However to make working with unknown types less awkward, I'd like to see a couple of other constructs being able to narrow the unknown type:
let x: unknown;
// Direct equality should narrow to the type we compare to
x === "1"; // should narrow x to string or the literal "1" type, similar for other types aswell
// All these should narrow x to {prop: any}
"prop" in x;
x.prop != null;
x.prop !== undefined;
typeof x.prop !== "undefined";
// typeof should work on properties of the unknown variable
typeof x.prop === "string"; // should narrow x to {prop: string}
Use Cases
Make unknown easier to work with!
// before, very verbose!
const x: unknown = undefined!;
function hasProp1(x: any): x is {prop1: any} {
return "prop1" in x;
}
function hasProp2(x: any): x is {prop2: any} {
return "prop2" in x;
}
// imagine doing this for many more properties
if (hasProp1(x)) {
x.prop1;
if (hasProp2(x)) {
x.prop2;
}
}
// ===========
// after, much more concise and less overhead
const x: unknown = undefined!;
if ("prop1" in x) {
x.prop1;
if ("prop2" in x) {
x.prop2;
}
}
Checklist
My suggestion meets these guidelines:
- This wouldn't be a breaking change in existing TypeScript / JavaScript code
- This wouldn't change the runtime behavior of existing JavaScript code
- This could be implemented without emitting different JS based on the types of the expressions
- This isn't a runtime feature (e.g. new expression-level syntax)
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reading the related pull request comment and issue 25172, then compare their discussion with the narrowing examples in this issue. The work is done when the agreed constructs narrow unknown as specified, including direct equality, property checks, in-operator checks, and typeof checks on properties.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- compilers
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 25/100