Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 类型脚本模板文字类型_Typescript_Typescript Typings - Fatal编程技术网

Typescript 类型脚本模板文字类型

Typescript 类型脚本模板文字类型,typescript,typescript-typings,Typescript,Typescript Typings,是否有人曾经运行过Typescript模板文字,但如果该类型以前是使用变量构造的,则无法识别该类型 下面是代码片段: const namespace = 'myNamespace'; type Keys = 'a' | 'b'; type NamespacedKeys = `${typeof namespace}/${Keys}`; type NamespacedObjects = Record<NamespacedKeys, string>; const foo: Name

是否有人曾经运行过Typescript模板文字,但如果该类型以前是使用变量构造的,则无法识别该类型

下面是代码片段:

const namespace = 'myNamespace';

type Keys = 'a' | 'b';

type NamespacedKeys = `${typeof namespace}/${Keys}`;

type NamespacedObjects = Record<NamespacedKeys, string>;

const foo: NamespacedObjects = {
  [`${namespace}/a`]: 'bar',
  [`${namespace}/b`]: 'toto',
} // this would have an error -> Type '{ [x: string]: string; }' is missing the following properties

const baz: NamespacedObjects = {
  'myNamespace/a': 'bar',
  'myNamespace/b': 'yolo',
} // this works 

const namespace='myNamespace';
键入键='a'|'b';
类型NamespacedKeys=`${typeof namespace}/${Keys}`;
类型NamespacedObjects=记录;
常量foo:NamespacedObjects={
[`${namespace}/a`]:'bar',
[`${namespace}/b`]:'toto',
}//这将有一个错误->类型“{[x:string]:string;}”缺少以下属性
const baz:NamespacedObjects={
“myNamespace/a”:“bar”,
“myNamespace/b”:“yolo”,
}//这很管用

问题在于编译器在遇到错误时不会自动推断错误。例如:

const key = `${namespace}/a`; 
// const key: string
的推断类型只是
字符串
,而不是字符串文本。如果希望编译器为此推断字符串文字类型,则需要使用以下命令显式要求它:

想知道为什么这不会自动发生?好吧,这项工作已经完成了。。。它显然打破了一堆已经在使用模板文本表达式的真实代码,但这取决于它的类型是
string
,而不是一些字符串文本。因此,这一点在年内得到了恢复。目前,我们只需使用
const
断言,至少在TS团队找出如何在不破坏太多现有代码的情况下获得更好的行为之前:

const foo: NamespacedObjects = {
  [`${namespace}/a` as const]: 'bar',
  [`${namespace}/b` as const]: 'toto',
} // okay

更改为
在您的示例中,请复制:
const foo: NamespacedObjects = {
  [`${namespace}/a` as const]: 'bar',
  [`${namespace}/b` as const]: 'toto',
} // okay