First of all, let me make it clear that what I'm looking isn't a union type but a straight up concatenation i.e "Hel" + "lo" = "Hello"
but for string literal types
Essentially I have a function which takes two string literals, a namespace
and a name
, and combines these with a / in between as it's output, but I can't figure out a way to make the output a string literal and not a generic string.
I need it to be a string literal because the output will be used as a key of an object.
I've tried type intersections(&
), +
, .concat()
function makeKey<NS extends string, N extends string>(namespace: NS, name: N) {
return namespace + '/' + name; // <- want this to be `NS + / + N` = `NS/N`
}
// I want this to return a string literal rather than a generic string
const objKey = makeKey('admin', 'home')
// I want typeof objKey to be a string literal: `"admin/home"`, not a generic `string`
typeof objKey
is a generic string
but I want it to be a string literal
"admin/home"
The answer is unfortunately no. There are several feature suggestions filed in GitHub that, if implemented, might give you such functionality (this or this) but I don't think they are being actively worked on. I don't see anything in the roadmap about it, anyway. If you really want to see this happen, you might want to go to one of those GitHub issues and give them a ???? or describe your use case if it's particularly compelling. But I wouldn't hold my breath. Sorry!
It worked for me, with typescript 3.7.2, using template literal to concatenate and the as
keyword to specify the output type of my function .
const addSuffixToMyStringLiteral =
(m: MyStringLiteral, suffix: string) => `${m}${suffix}` as MyStringLiteral;
I don't know if it a new feature of typescript or not.
©2020 All rights reserved.