Ah—unions of strings (e.g., `"foo" | "bar"`) effectively are enums in TypeScript and JavaScript. They are autocompleted and type-checked at compile time, so you should get exactly the same behavior. Even exhaustiveness checking. See docs[1] for details.
And, to the specific point: you absolutely should not have to look up the docs. These values definitely will autocomplete.
Anyway, aside from all that, unions of strings is "the idiomatic way" to do this sort of thing in TypeScript and JavaScript.
None of the properties in the DatabaseInstance construct example posted above are defined as unions of strings - the TypeScript documentation link you just posted is irrelevant.
This is what one of the property types actually look like:
/**
* The MySQL or PostgreSQL version to
* use. Can be `MYSQL_5_6`, `MYSQL_5_7`, `POSTGRES_9_6` or `POSTGRES_11` (beta) for second-generation
* instances, or `MYSQL_5_5` or `MYSQL_5_6` for first-generation instances.
* See [Second Generation Capabilities](https://cloud.google.com/sql/docs/1st-2nd-gen-differences)
* for more information.
*/
readonly databaseVersion?: pulumi.Input<string>;
In AWS CDK it was an easy task to select Postgres - in Pulumi case I had to read the comment.
Oh, I see. Some properties that are not as well-typed as they could be, that's true. We are working on that. But there are lots of properties that do have good typing. Instance types, for example.
And, to the specific point: you absolutely should not have to look up the docs. These values definitely will autocomplete.
Anyway, aside from all that, unions of strings is "the idiomatic way" to do this sort of thing in TypeScript and JavaScript.
[1]: https://www.typescriptlang.org/docs/handbook/advanced-types....