怪异场景中的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完成了。也参考了您关于功能的想法。