typescript - 我应该将哪种类型用于打字稿中的实例属性?
问题描述
我有 class 的实例Foo
。
我想从变量中打印hi
属性,例如:string
class Foo {
hi() { console.log('hi') }
}
const instance = new Foo();
const go = (field: string): void => instance[field]()
go('hi')
哪种类型必须是property
可变的?它不是打字稿的字符串。
错误:
类型,因为“字符串”类型的表达式不能用于索引类型 Foo
解决方案
首先,我们应该确保属性名称是可调用的。想象一下情况,您有一个具有混合属性的实例。可调用而不可调用。
class Foo {
notCallable = 10
hi() { console.log('hi') }
}
const instance = new Foo();
type Fn = (...args: any[]) => any
type Callable<T> = {
[Prop in keyof T]: T[Prop] extends Fn ? Prop : never
}[keyof T]
type Test = Callable<typeof instance> // 'hi'
您可能已经注意到,Callable
仅返回可调用属性。
让我们将我们的限制应用于函数:
class Foo {
notCallable = 10
hi() { console.log('hi') }
}
const instance = new Foo();
type Fn = (...args: any[]) => any
type Callable<T> = {
[Prop in keyof T]: T[Prop] extends Fn ? Prop : never
}[keyof T]
type Test = Callable<typeof instance> // 'hi'
const call = <Obj,>(inst: Obj) =>
<Key extends Callable<Obj>>(key: Key) =>
inst[key]();
const applyObject = call(instance);
const callMethod = applyObject('hi')
尝试提供除hi
to之外的任何其他属性applyObject
,TS 会抛出错误
推荐阅读
- r - 根据 R 中另一个值的频率组合一列中的多行值
- kotlin - 如何描述事件结构并获取信息?
- kubernetes - 负载平衡“Hello World”Kubernetes 应用程序
- ffmpeg - 带有 FLAC 的 MKV 到带有 FFMPEG 的 MP4
- javascript - Javascript停止倒计时
- node.js - Nodejs 只发送 Mongoose: details.insertOne({ _id: ObjectId("5e5261c523d3fd10c0bfe4d5"), __v: 0 }, { session: null }) 到数据库
- react-native - 'UMReactNativeAdapter/UMModuleRegistryAdapter.h' 文件未找到
- holoviews - 如何在全息视图中设置散点圆半径?
- javascript - 在请求对象 Node.js 服务器中传递敏感信息
- android - 如何从 kotlin 片段中的 onClickListener 打开片段?