type UserId = `user_${string}`;
type GroupId = `group_${string}`;
const addUserId = (id: UserId) => {
// do something
}
const processId = (id: string) => {
if (id.startsWith('user_') {
// type error here:
addUserId(id);
} else if (otherCondition)
// do other things
}
}
Instead you define a function:
const isUserId = (some: string): some is UserId => some.startsWith('user_');
Now you can use it as follows:
const processId = (id: string) => {
if (isUserId(id)) {
// no more error:
addUserId(id);
} else if (otherCondition)
// do other things
}
}
Comments
What is the problem with the workaround suggested in the last comment there?
Define a type guard using a "type predicate"[1].
For example:
Instead you define a function: Now you can use it as follows: [1]: https://www.typescriptlang.org/docs/handbook/2/narrowing.htm...You shouldn't need to write this kind of thing manually for every such type.
If you do that often you probably want to create separate functions, e.g.:
Not too bad.