我有一个带有 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',
}),
});
关于TypeScript:当匿名对象属性不满足类型规范时强制类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74032060/