Javascript 在TypeScript中,当前是否存在将两个或多个字符串文字类型连接到单个字符串文字类型的方法?

Javascript 在TypeScript中,当前是否存在将两个或多个字符串文字类型连接到单个字符串文字类型的方法?,javascript,string,typescript,function,types,Javascript,String,Typescript,Function,Types,首先,让我明确指出,我所寻找的不是联合类型,而是一种直接连接,即“Hel”+“lo”=“Hello”,而是字符串文字类型 本质上,我有一个函数,它接受两个字符串文本,一个名称和一个名称,并将它们与中间的/in组合作为输出,但我无法找到一种方法使输出成为字符串文本而不是一般字符串 我需要它是字符串文字,因为输出将用作对象的键 我尝试过键入交叉点(&)、+、.concat() 函数makeKey(名称空间:NS,名称:N){ 返回命名空间+'/'+name;//TS4.1+答案: 您现在可以使用来执

首先,让我明确指出,我所寻找的不是联合类型,而是一种直接连接,即
“Hel”+“lo”=“Hello”
,而是字符串文字类型

本质上,我有一个函数,它接受两个字符串文本,一个
名称
和一个
名称
,并将它们与中间的/in组合作为输出,但我无法找到一种方法使输出成为字符串文本而不是一般字符串

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

我尝试过键入交叉点(
&
)、
+
.concat()

函数makeKey(名称空间:NS,名称:N){
返回命名空间+'/'+name;//TS4.1+答案:

您现在可以使用来执行此操作:

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

const objKey = makeKey('admin', 'home');
// const objKey: "admin/home"
函数makeKey(名称空间:NS,名称:N){
将命名空间+'/'+名称返回为`${NS}/${N}`
}
const objKey=makeKey('admin','home');
//康斯特·奥布基:“管理员/家庭”


前TS4.1答案:

答案是不幸的。GitHub中有几个功能建议,如果实现,可能会提供这样的功能(在映射类型期间增加键,或者通过正则表达式操作字符串类型)但我不认为他们正在积极地工作。无论如何,我看不到任何关于它的信息。如果你真的想看到这种情况发生,你可能希望转到其中一个GitHub问题,并给他们一个TS4.1+答案:

您现在可以使用来执行此操作:

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

const objKey = makeKey('admin', 'home');
// const objKey: "admin/home"
函数makeKey(名称空间:NS,名称:N){
将命名空间+'/'+名称返回为`${NS}/${N}`
}
const objKey=makeKey('admin','home');
//康斯特·奥布基:“管理员/家庭”


前TS4.1答案:


答案是不幸的。GitHub中有几个功能建议,如果实现,可能会提供这样的功能(在映射类型期间增加键,或者通过正则表达式操作字符串类型)但是我不认为他们正在积极地工作。无论如何,我没有看到任何关于它的信息。如果你真的想看到这种情况发生,你可能想转到那些GitHub问题中的一个,给他们一个它对我有效,使用typescript 3.7.2,使用模板文字来连接,
as
关键字来指定输出类型我的职责

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

我不知道它是否是typescript的一个新功能。

它对我有效,在typescript 3.7.2中,使用模板文字连接,并使用
as
关键字指定我函数的输出类型

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

我不知道它是否是typescript的新功能。

一旦发布模板字符串类型(类似于typescript 4.1):


更多详细信息和示例

一旦发布了模板字符串类型(如typescript 4.1所示):


更多详细信息和示例

字符串文字在typescript中是一种单独的类型吗?它是string类型的子集,或多或少与string EnumsNo相同,目前没有这样做的方法。很遗憾,答案是。有几条建议可能会为您提供此功能(或)但我认为这些都没有被考虑。@GetOfMyLawn模板文字是独立的东西,字符串文字是typescript类型string文字是typescript中的一种独立类型吗?它是string类型的一个子集,或多或少与string EnumsNo相同,没有当前的方法。很遗憾,答案是是否为您提供此功能(或)但我不认为这些是被考虑的。@GetOfMyLawn模板文字是独立的东西,字符串文字是类型脚本类型响应类型是MyStringLiteral.OP预期的例如literalexamplesuffix。响应类型是MyStringLiteral.OP预期的例如literalexamplesuffix。谢谢@jcalz!我继续并在其中一个t上留下了评论他对我的用例进行了线程处理。我不知道这是一件事。非常酷,谢谢。谢谢@jcalz!我继续对我的用例中的一个线程进行了评论。我不知道这是一件事。非常酷,谢谢。
type EventName<T extends string> = `${T}Changed`;
type Concat<S1 extends string, S2 extends string> = `${S1}${S2}`;
type T0 = EventName<'foo'>;  // 'fooChanged'
type T1 = EventName<'foo' | 'bar' | 'baz'>;  // 'fooChanged' | 'barChanged' | 'bazChanged'
type T2 = Concat<'Hello', 'World'>;  // 'HelloWorld'
type T3 = `${'top' | 'bottom'}-${'left' | 'right'}`;  // 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'