这似乎是设计限制或打字中的错误the Map构造函数 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/Map; see 微软/TypeScript#39133 https://github.com/microsoft/TypeScript/issues/39133有关类似问题的更多信息。目前当您拨打电话时new Map()
编译器尝试将其与三个之一匹配超载 https://www.typescriptlang.org/docs/handbook/2/functions.html#function-overloads;你经过的地方没有争论 https://github.com/microsoft/TypeScript/blob/8cdcec4454d0afe90cf67a6ecf2410d11c2f486c/lib/lib.es2015.collection.d.ts#L32,你传入一个条目数组 https://github.com/microsoft/TypeScript/blob/8cdcec4454d0afe90cf67a6ecf2410d11c2f486c/lib/lib.es2015.collection.d.ts#L33和一个你通过的地方general iterable条目数 https://github.com/microsoft/TypeScript/blob/main/lib/lib.es2015.iterable.d.ts#L160。后两个构造函数是generic https://www.typescriptlang.org/docs/handbook/2/generics.html在密钥类型中K
和值类型V
正在构建的地图。当数组或可迭代对象具有完全相同的一种类型的键和完全相同的一种类型的值时,就没有问题。但您遇到的限制是编译器无法自动推断K
or V
如果他们中的任何一个应该是union https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#union-types type.
在你的情况下,关键类型是string
,但值类型似乎是一个联合,这会导致编译器崩溃。看起来您有以下形式的基本值类型:
interface Test {
test: 'equal' | 'include' | 'notInclude',
expected: string;
};
Your Map
将保存类型的值Test
,但它也将保存值arrays或其他Map
s那种类型的。也就是说,值类型看起来像一个递归定义的联合:
type TestValue = Test | Map<string, TestValue> | Array<TestValue>;
您可能有一些稍微不同的约束,但这是我根据示例的猜测。无论如何,一旦我们确定您的地图具有类型的键string
和类型的值TestValue
,那么我们可以manually指定K
and V
当我们调用泛型时Map
构造函数,如new Map<string, TestValue>(...)
:
const TESTS = [
['reminderEmail', new Map<string, TestValue>([
['subject', { test: 'equal', expected: 'Kindly complete your setup' }],
['headers', new Map([
['X-Link', { test: 'equal', expected: 'someUrl' }],
['X-Template-Name', { test: 'equal', expected: 'reminderFirst' }],
['X-Template-Version', { test: 'equal', expected: 'someVersion' }],
])],
['html', [
{ test: 'include', expected: "Here's your reminder" },
{ test: 'include', expected: 'someUrl' },
{ test: 'include', expected: 'someUrl' },
{ test: 'include', expected: 'device' },
]],
['text', [
{ test: 'include', expected: "Here's your reminder" },
{ test: 'notInclude', expected: 'someUrl' },
{ test: 'notInclude', expected: 'someUrl' },
{ test: 'notInclude', expected: 'utm_source=email' },
]],
])],
];
现在没有错误了。
Playground 代码链接 https://www.typescriptlang.org/play?#code/JYOwLgpgTgZghgYwgAgCoQM5mQbwFDLKRYBcyA5BAI4CucANucgD4WgL00AmETr5IAPZgAkiA7deAGgLIIADwAOEBJC5ksUUAHMA3HgC++vGACeytJjAA1BjRQBeS1hbIAsnEUAeTTqnObOwgAPlcAQSgoOFMvdCxbThDjBEEQF1QAUQBlVCzkJwBtWQLyKAgAW1AeKAzyuGBGfxAIAHd3Tx8wLRBtfzjAxOCACiLCQhKMGgAjACsVMHJ-HCIrMkpaBkW5JXmIdQoAaSr6U2QU8sV6CEhkU0EaKGQMa5pFJgMAXRkx5BKACwgcGqGC2zTaHkUI1kPxKAA0ALQAGVAAGststiGA1tQ6I1tspVHs1hhBOUIABVKCMZCfb4-X7kBHoC70OCQeEAOTgZPRK1IFBxm38CgJajWZUqIGqADFgFAsO8vtCxnD4czLmyIPDrNAMMBUrzMdiNniRbt9uQSWSdfL9SBFXTCB8AJRKmHkP5gcp40b0jGrNjiTg8LZmwn7ABEAAloBAAGQAYnkACYAOy6DC3e6PCVVaARmmOsb+-nkdjB6T483E0kUqnvIuEEtYwMSEPCnbhmtkynUgyN3B8ltloOSUOdsUUHgAN2ASAbyo+bpV5Eg8gW-l9P2ba3LY47oqJyGjsctWYeyFzUvzheVTaHayEolH7arXYoVrrfYHO4oT7EbaVmGk6WrWvYLvSg5Gn+wgARW46HhaNBegA+iSDxIA4FT1N+i7Li6SofMYQA