Если вы действительно хотите иметь эту ошибку, вы можете объявить Example
как интерфейс, а не тип пересечения. Так как 2.2 , интерфейс может расширять тип объекта (или даже тип пересечения)
type ExampleA = {
a: string;
}
type ExampleB = {
b: number;
}
type ExampleC = {
c: boolean;
}
interface Examples extends ExampleA, ExampleB, ExampleC {
}
function foo(pattern: { [key: string]: string }) {
console.log(pattern);
}
const bar: Examples = { a: 'foo', b: 1, c: false };
foo(bar); // error
Или даже таким образом, чтобы лучше проиллюстрировать разницу между интерфейсом и типами пересечений:
type Examples = ExampleA & // the same as in question
ExampleB &
ExampleC;
interface IExamples extends Examples { // empty interface "collapses" the intersection
}
const bar1: Examples = { a: 'foo', b: 1, c: false };
foo(bar1); // no error
const bar2: IExamples = { a: 'foo', b: 1, c: false };
foo(bar2); // error
Еще один способ построения типа объекта из пересечения, как предложил Тициан в комментарии, - использовать сопоставленный тип, который почти, но не совсем идентичен его общему параметру:
type Id = { [P in keyof T]: T[P] }
const bar3: Id = { a: 'foo', b: 1, c: false };
foo(bar3); // error