保留TypeScript中的文本类型时限制类型下限

3ks5zfa0  于 2023-03-13  发布在  TypeScript
关注(0)|答案(1)|浏览(129)

如何Assert表达式必须符合某种类型,同时保留其精确的文本类型?

type Foo = {
  foo: string;
}
const foobar = { foo: "foo", bar: "bar"};

// should infer typeof foobar but fail when it is not subtype of Foo
const fooLike = requireSubtype<Foo>({ foo: "foo", bar: "bar"});

// preserves .bar
fooLike.bar;

// this should fail to typecheck due to missing .foo
requireSubtype<Foo>({bar: "bar"});

我能想到的最接近的说法是:

const requireSubtype = <U>() => <T extends U>(o: T): T => o;

const foo2 = requireSubtype<Foo>()({ foo: "", bar: "" })

但是这需要中间功能并且是丑陋的。
只有一个函数的解决方案是很好的,没有函数(纯粹带有类型约束)是理想的。

oprakyz7

oprakyz71#

但是这需要中间功能并且是丑陋的。
直到最近,这还是唯一的办法。
现在,我们有了satisfies运算符,它几乎可以完成您所寻找的内容:

type Foo = {
  foo: string;
}

const foobar = { foo: "foo", bar: "bar"};

// should infer typeof foobar but fail when it is not subtype of Foo
const fooLike = foobar satisfies Foo;

// preserves .bar
fooLike.bar;

const bar = { bar: "bar"}

// this should fail to typecheck due to missing .foo
const barLike = bar satisfies Foo;

Playground

相关问题