网站搜索

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',
  }),
});

操场