TypeScript中用于内联对象构造的类型安全“as”

mepcadol  于 2023-03-24  发布在  TypeScript
关注(0)|答案(1)|浏览(110)

在TypeScript中,我经常需要一个对象具有某种类型,因为推断的类型不会产生所需的结果--这种情况发生在具有基类的类型层次结构中,或者当中间体用于存储值时。
我一直在使用“as”,但它不是类型安全的,例如,给定:

interface SomeType {
  some: integer
}

然后:

{ some: 123 } as SomeType // this passes
{ wrong: "abc" } as SomeType // but this also passes

如果我给一个变量赋值,我可以得到我想要的:

const a : SomeType = { wrong: "abc" } // fails as desired

但在某些情况下,使用变量是不方便的。* 有没有一种等效的方法可以将类型安全强制转换为表达式?*
对于我的使用,我添加了一个简单的函数,似乎可以工作:

export function safeAs<T>(value: T): T {
  return value
}

然后:

safeAs<SomeType>({ some: 123 }) // this passes
safeAs<SomeType>({ wrong: "abc" }) // this fails, as wanted

但它感觉这是一个基本的需求,我假设我错过了一些已经可以做到这一点的语法。
注意:我需要在TSX(react)文件中使用它,我知道它有时会影响泛型/类型语法。

fnx2tebb

fnx2tebb1#

TS版本4.9通过引入satisfies运算符解决了这个问题。

const t1 = { some: 123, foo: 0 } as SomeType; // this passes :(
const t2 = { some: 123, foo: 0 } satisfies SomeType; // errors on extra property
const t3 = { some: "123" } satisfies SomeType; // errors on wrong type

Playground
参见new Typescript "satisfies" operator

相关问题