Issue
OI have gotten two values from api, one is fruit
and another is vegetable
. I only know both type are string, but not the exactly values.
// fruit can be any string, not apple only, same on vegetable. I don't know what exactly value api return.
const fruit: string = 'apple'
const vegetable: string = 'onion'
I want to define a type Food
, which can contain the substring fruit
and vegetable
.
As I don't know the return value from api, I cannot define a type like
type Fruit = 'apple' | 'banana'
const fruit: Fruit = 'apple
I know in this way, it's working. But my one is not Fruit
, it's only string
.
This is what I tried
type Fruit = typeof fruit
type Vegetable = typeof vegetable
type Food = `${Fruit} ${Vegetable} ${string}`
In this way, the type is {string} {string} {string}
, the first two is not the exacly value from fruit and vegetable. The below is what I want
const test1: Food = 'a b c d'; // wrong
const test2: Food = 'apple onion c d'; // pass
How can I define that Food
type if I cannot have a union type for the value, only can be a generic string
type?
Solution
This is not possible.
The type system only works at compile time. That means that before your code ever runs. But a value from an external API wont exist until runtime. When you app is running there is no type system.
That means that if an API is typed to return string
, that's the most you can know about it.
The closest thing you can do is a type predicate:
function hasApple(input: string): input is `${string}apple${string}` {
return input.includes('apple')
}
const bad: `${string}apple${string}` = input // error
if (hasApple(input)) {
const good: `${string}apple${string}` = input // works
}
But then you have to know exactly what you are looking for. So unless you know what strings could be returned, this won't help much.
The most specific a type of a runtime value can be is all the possibilities of that that runtime value.
Answered By - Alex Wayne
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.