因为TypeScrip类属性可以有不同类型的getter和setter since 4.3,我不知道应该由谁来正确获取属性的getter和setter类型.

=

由于类属性被视为变量,我无法正确区分给定属性是否具有getter、nor/和setter及其类型(因为Parameters<I>ReturnType<I>只能在函数/方法上工作).

对预期结果的一些 idea :

class Foo {
    get bar(): number { /** ... */ }
    set bar(baz: string) { /** ... */ }
}

type GetterOfFooBar = GetterOf<typeof Foo.prototype.bar>; // number
type SetterOfFooBar = SetterOf<typeof Foo.prototype.bar>; // string
class Foo {
    get bar(): number { /** ... */ }
}

type GetterOfFooBar = GetterOf<typeof Foo.prototype.bar>; // number
type SetterOfFooBar = SetterOf<typeof Foo.prototype.bar>; // never

推荐答案

任何使用类型系统来观察变量访问器的属性类型都将产生You read的类型,而不是You write的类型.这意味着GetterOf<T>很容易,但SetterOf<T>是不可能的.

这似乎没有得到很好的记录.在microsoft/TypeScript#53417microsoft/TypeScript#53594的讨论中提到:

我们总是挑选阅读类型.

以及microsoft/TypeScript#42425年度的实施说明:

类型系统在其他操作中保持完全协变!这有一些可能不会立即显现的影响:……带有不同的getter/setter的类型在通过映射类型时有效地减少到它们的get%……类型T[K]仍然是指T上的Kread类型

microsoft/TypeScript#43729处存在允许查询设置器类型的请求.还有可能的是,如果实现microsoft/Typescript#43826处的请求以支持映射类型和索引签名中的变量访问器,则它将允许隔离并因此查询设置器类型.但就目前而言,这不是语言的一部分.

Typescript相关问答推荐

有没有办法适当缩小类型?

TypScript手册中的never[]参数类型是什么意思?

类型安全JSON解析

具有继承的基于类的react 组件:呈现不能分配给基类型中的相同属性

如何编写一个类型脚本函数,将一个对象映射(转换)为另一个对象并推断返回类型?

我可以为情态车使用棱角形的路由守卫吗?

Material UI / MUI系统:我如何告诉TypeScript主题是由提供程序传递的?

分解对象时出现打字错误

使用动态输出类型和泛型可重用接口提取对象属性

为什么我在这个重载函数中需要`as any`?

将对象的属性转换为正确类型和位置的函数参数

从以下内容之一提取属性类型

如何使用angular15取消选中位于其他组件中的复选框

TS 排除带点符号的键

如何使用动态生成的键和值定义对象的形状?

React HashRouter,单击导航栏时页面重新加载出现问题

在Nestjs中,向模块提供抽象类无法正常工作

在 next.js 13.4 中为react-email-editor使用forwardRef和next/dynamic的正确方法

TS 条件类型无法识别条件参数

通过函数将对象文字类型映射到另一种类型的方法或解决方法