Reputation: 1550
I have a method with string literal type guard
type Status = 'new' | 'update' | 'close';
itemRequest(status: Status) {
itemService.subscribeToChanges(status) //third party library method
}
Difficulty I have is this third party method accepts string not my custom string type Status
subscribeToChanges(status: string)
How can I make my string literals are actually types of string and when I pass to third party method. It understand it's actually a string?
Upvotes: 10
Views: 43573
Reputation: 10538
You are able to cast your value of the Status
to a string like this:
type Status = 'new' | 'update' | 'close';
itemRequest(status: Status) {
itemService.subscribeToChanges(status as string)
}
Do not use String(status)
. This constructs a new string
object from status
and is a wasteful allocation. The cast will be erased at runtime and just corrects TypeScript's knowledge of the type of the status
variable. Remember that any type checking TypeScript does is done at compile time and has no runtime cost nor presence.
This code will be compiled to the following:
itemRequest(status) {
itemService.subscribeToChanges(status)
}
I am however confused as to why this is happening. Your type alias are all of type string
so casting from Status
to string
should be a upcast (i.e, permissible under any reasonable type checker). The other way around would be the main issue. Indeed, your original code works just fine on it's own.
Upvotes: 5
Reputation: 4149
It should work. In JavaScript it is a normal string. Check out this sample or visit it in the playground.
// TypeScript
type Status = 'new' | 'update' | 'close';
function itemRequest(status: Status) {
itemService.subscribeToChanges(status) //third party library method
}
let myStatus: Status = 'update';
itemRequest(myStatus);
// Compiled JavaScript
function itemRequest(status) {
itemService.subscribeToChanges(status); //third party library method
}
var myStatus = 'update';
itemRequest(myStatus);
Upvotes: 0
Reputation: 3801
Can you make Status an enum? Then you can use Status[status]
which will be the string value you expect.
i.e.
enum Status { new, update, close }
itemRequest(status: Status) {
itemService.subscribeToChanges(Status[status]) //third party library method
}
Upvotes: 0