TypeScript:当匿名对象属性不符合类型规范时强制类型错误



我有一个匿名对象,它具有TypeScript类型的属性。类似这样的东西:

type Foo = {
exists: true;
bar: string;
};
doSomething({
foo: {
exists: true,
bar: 'baz',
} as Foo,
});

我想键入保护foo属性,所以如果类型Foo在未来发生更改(例如获得新属性(,则TypeScript编译器会警告我。虽然这些会导致编译器错误:

doSomething({
foo: {
exists: 'string', // Incorrect type
bar: 'baz',
} as Foo
});
doSomething({
foo: {
say: 'hello', // Not enough overlap with Foo
bar: 'baz',
} as Foo
});

这不会导致类型错误,即使exists丢失:

doSomething({
foo: {
bar: 'baz',
} as Foo
});

同样,这也不会导致类型错误:

doSomething({
foo: <Foo>{
bar: 'baz',
},
});

Foo的属性丢失时,我可以强制执行类型错误的唯一方法是:

const foo: {foo: Foo} = {
foo: {
bar: 'baz',
},
};
doSomething(foo);

但这需要我不必要地创建一个局部变量,仅仅是为了类型安全。有没有一种方法可以键入保护匿名对象的属性?

注意:doSomething()的参数接受any,不强制执行任何类型要求,否则我可以依赖doSomething强制执行类型。

TypeScript 4.9将引入satisfies运算符。

doSomething({
foo: {
bar: 'baz',
} satisfies Foo,
});

在此之前,您可以在编译时使用另一个函数来验证foo

const validFoo = (foo: Foo) => foo
doSomething({
foo: validFoo({
bar: 'baz',
}),
});

游乐场

最新更新