如何在TypeScript中获取setter属性的类型?

ff29svar  于 2022-11-26  发布在  TypeScript
关注(0)|答案(1)|浏览(139)

定义一个对象的类型,其中包含不同类型的getter和setter。如何获取setter的类型?
定义包含不同类型的getter和setter的对象的类型。

type Foo = {
    get bar(): number;
    set bar(value: number | string);
}

当试图获取属性的类型时,只能获取getter的类型。

type Bar = Foo["bar"]; // number

那么我如何才能得到setter的类型呢?比如上面例子中的number | string
我试过了,但是不管用。

type SetterType<T, U extends string> = T extends { set [key in U]: infer P } ? P : never;
type Bar = SetterType<Foo, "bar">;

添加使用:

假设一个API如下所示。

const foo = addFoo(); // function addFoo returns type Foo.
foo.bar = 123;
foo.bar = "123"; // setter type works fine.
foo.baz = true;
// other properties...

我想 Package 这个函数,通过一个文本对象来表示这些属性。
通过Object.assign在内部实现。

function myAddFoo(properties: Partial<Foo>): Foo {
    const foo = addFoo();
    Object.assign(foo, properties);
    return foo;
}

const foo = myAddFoo({
    bar: "123", // Error, `bar` must be number | undefined.
    baz: true,
    // other properties...
});

文字对象中的bar属性不能接受setter类型number | string
所以这个函数的参数必须接受setter的类型。

type FooSetters = /* infer all setters type, like `{ bar: number | string }` */;
function myAddFoo(properties: Partial<Omit<Foo, keyof FooSetters> & FooSetters>): Foo
hmmo2u0o

hmmo2u0o1#

基本的Equal不能比较类型,所以你要么不能这样做,要么需要一个更好的等价类

export type Equal<X, Y> =
  (<T>() => T extends X ? 1 : 2) extends
  (<T>() => T extends Y ? 1 : 2) ? true : false

type x6 = Equal<{
  // ^? true
  get bar(): 1;
  set bar(v: 1 | 2);
},{
  get bar(): 1;
  set bar(v: 1 | 2 | 3);
}>

相关问题