Is there currently anyway to concatenate two or more string literal types to a single string literal type in TypeScript right now?

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"

Answers:

Answer

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!

Answer

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.

Tags

Recent Questions

Top Questions

Home Tags Terms of Service Privacy Policy DMCA Contact Us Javascript

©2020 All rights reserved.