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 来强制类型。
答案#1
TypeScript 4.9 将引入 satisfies 操作符。
doSomething({
foo: {
bar: 'baz',
} satisfies Foo,
});
在那之前,您可以使用另一个函数在编译时验证 foo。
const validFoo = (foo: Foo) => foo
doSomething({
foo: validFoo({
bar: 'baz',
}),
});
操场
