Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.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 - Fatal编程技术网

怪异场景中的Typescript编译错误

怪异场景中的Typescript编译错误,typescript,Typescript,我有一种类型: type MyObject = { [index:string]: MyObject | Function | "wtf" } 当我创建这种类型的变量时,它会在以下基本示例中编译: // compiles const myObj: MyObject = { name: "wtf", }; 与嵌套键一样-注意,嵌套键是notName:,而不是name: // compiles const myObj: MyObject = { wrapper: {

我有一种类型:

type MyObject = {
    [index:string]: MyObject | Function | "wtf"
}
当我创建这种类型的变量时,它会在以下基本示例中编译:

// compiles
const myObj: MyObject = {
    name: "wtf",
};
与嵌套键一样-注意,嵌套键是
notName:
,而不是
name:

// compiles
const myObj: MyObject = {
    wrapper: {
        notName: "wtf",
    },
};
一旦我将嵌套键更改为
名称:
,它将无法编译:

/*
Type '{ name: string; }' is not assignable to type 'Function | MyObject | "wtf"'.
  Type '{ name: string; }' is not assignable to type '"wtf"'

*/
const myObj: MyObject = {
    wrapper: {
        name: "wtf",
    },
};
其他奇怪之处是,如果我从union中删除
函数
,它会编译:

type MyObjectNoFunction = {
    [index:string]: MyObjectNoFunction | "wtf"
}

let myObjNoFn: MyObjectNoFunction = {
    wrapper: {
        name: "wtf"
    }
};
更奇怪的是,如果我的tsconfig中没有任何lib,比如es6,那么一切都可以编译

tsconfig:

{
  "compilerOptions": {
    "lib": [
      "es6"
    ],
    "noImplicitReturns": true,
    "noFallthroughCasesInSwitch": true,
    "noUnusedLocals": true,
    "strict": true
  }
}

查看一个不确定是什么导致TS混淆,但这里有一个粗略的猜测:可能这是因为
函数
在es6中有一个
名称
属性,所以TypeScript推断
{name:“something”}
是一个未完成的
函数
类型声明

无论如何,这里有一些方法可以解决这个问题

您可以显式键入内部对象,如下所示:

type MyObject = {
  [index:string]: MyObject | Function | "wtf"
}

const innerMyObject: MyObject = {
  name: "wtf",
}

const myObj: MyObject = {
  wrapper: innerMyObject,
};
type MyObject = {
  [index:string]: MyObject | Function | "wtf"
}

const myObj: MyObject = {
  wrapper: {
      name: "wtf" as "wtf",
  },
};
或者您可以显式键入字符串文本,如下所示:

type MyObject = {
  [index:string]: MyObject | Function | "wtf"
}

const innerMyObject: MyObject = {
  name: "wtf",
}

const myObj: MyObject = {
  wrapper: innerMyObject,
};
type MyObject = {
  [index:string]: MyObject | Function | "wtf"
}

const myObj: MyObject = {
  wrapper: {
      name: "wtf" as "wtf",
  },
};

不确定到底是什么导致TS混淆,但这里有一个猜测:可能这是因为
函数
在es6中有一个
名称
属性,所以TypeScript推断
{name:“something”}
是一个未完成的
函数
类型声明

无论如何,这里有一些方法可以解决这个问题

您可以显式键入内部对象,如下所示:

type MyObject = {
  [index:string]: MyObject | Function | "wtf"
}

const innerMyObject: MyObject = {
  name: "wtf",
}

const myObj: MyObject = {
  wrapper: innerMyObject,
};
type MyObject = {
  [index:string]: MyObject | Function | "wtf"
}

const myObj: MyObject = {
  wrapper: {
      name: "wtf" as "wtf",
  },
};
或者您可以显式键入字符串文本,如下所示:

type MyObject = {
  [index:string]: MyObject | Function | "wtf"
}

const innerMyObject: MyObject = {
  name: "wtf",
}

const myObj: MyObject = {
  wrapper: innerMyObject,
};
type MyObject = {
  [index:string]: MyObject | Function | "wtf"
}

const myObj: MyObject = {
  wrapper: {
      name: "wtf" as "wtf",
  },
};

我喜欢你的第一个解决方案,这样它仍然是真正的类型,而不仅仅是铸造。你认为这值得向typescript回购提交一个问题吗?@mcclaskc是的,提交一份bug报告是个好主意。@Dayturns完成了。也参考了您关于
功能的想法。我喜欢你的第一个解决方案,这样它仍然是真正的类型,而不仅仅是铸造。你认为这值得向typescript回购提交一个问题吗?@mcclaskc是的,提交一份bug报告是个好主意。@Dayturns完成了。也参考了您关于
功能的想法。