无论如何,现在是否有在TypeScript中将两个或多个字符串文字类型连接为单个字符串文字类型?

时间:2019-01-23 19:53:46

标签: javascript string typescript function types

首先,让我说清楚,我要查找的不是联合类型,而是一个直接的串联,即"Hel" + "lo" = "Hello",但是字符串文字类型

基本上,我有一个函数,它接收两个字符串文字,一个namespace和一个name,并在输出时将它们与/组合在一起,但我不知道一种方法将输出设为字符串文字而不是通用字符串。

我需要将其作为字符串文字,因为输出将用作对象的键。

我尝试过类型交集(&),+.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是通用的string,但我希望它是string literal "admin/home"

3 个答案:

答案 0 :(得分:5)

很遗憾,答案是no。 GitHub上提出了一些功能建议,这些建议如果实施,可能会为您提供这样的功能(thisthis),但我认为它们并未得到积极的研究。无论如何,我在roadmap中什么都看不到。如果您真的想看到这种情况发生,那么您可能想转到其中一个GitHub问题,给他们一个?或描述它的用例(如果它特别引人注目)。但是我不会屏住呼吸。抱歉!

答案 1 :(得分:0)

一旦发布模板字符串类型(类似于打字稿4.1),就有可能:

function makeKey<NS extends string, N extends string>(namespace: NS, name: N) {
    return (namespace + '/' + name) as `${NS}/${N}`;
}

const objKey = makeKey('admin', 'home') // objKey is of type 'admin/home'

Playground


模板字符串类型是与模板字符串表达式等效的类型空间。与模板字符串表达式相似,模板字符串类型包含在反引号分隔符中,并且可以包含格式为${T}的占位符,其中T是可分配给string,{{1}的类型},numberboolean。模板字符串类型提供了连接文字字符串,将非字符串原始类型的文字转换为其字符串表示形式以及更改字符串文字的大小写或大小写的功能。此外,通过类型推断,模板字符串类型提供了字符串模式匹配和分解的简单形式。

一些例子:

bigint

更多详细信息和示例here

答案 2 :(得分:-4)

它对我来说很有效,使用打字稿3.7.2,使用模板文字进行连接,并使用as关键字指定函数的输出类型。

const addSuffixToMyStringLiteral =
    (m: MyStringLiteral, suffix: string) => `${m}${suffix}` as MyStringLiteral;

我不知道它是否是打字稿的新功能。