今天面试遇到一道题,想了很久也没有想出来
type Events = { ready: void error: Error reconnecting: { attempt: number; delay: number }}type RedisClient = { on<T extends keyof Events>(event: T, f: (arg: Events[T]) => void): void}let aa: RedisClient = 这里要怎么写aa.on('ready', () => { console.log(12312)})
我是这样写的,但是报错了
let aa: RedisClient = { on: function (event, f): void { switch (event) { case 'ready': f() break case 'error': f(new Error()) break case 'reconnecting': f({ attemp: 1, delay: 1 }) break default: break } }}
f()的参数有问题,想请教一下大家应该如何写?
let aa: RedisClient = { on(event, fn) { const redis: Events = { ready: undefined, error: new Error('error massage'), reconnecting: { attempt: 3, delay: 300 } } fn(redis[event]) }}
type Events = { ready: void error: Error reconnecting: { attempt: number; delay: number }}type RedisClient = { on<T extends keyof Events>(event: T, f: (arg: Events[T]) => void): void}let aa: RedisClient = { on(event, f): void { switch (event) { case 'ready': (f as ((arg: Events["ready"]) => void))(); break case 'error': (f as ((arg: Events["error"]) => void))(new Error()) break case 'reconnecting': (f as ((arg: Events["reconnecting"]) => void))({ attempt: 1, delay: 1 }) break default: break } }}aa.on('ready', () => { console.log(12312)})
只能这么写了
type RedisClient<T extends keyof Events> = { on(event: T, f: (arg: Events[T]) => void): void}
只能这样改了,不然就只能强行as
type Events = { ready: void error: Error reconnecting: { attempt: number; delay: number }}type RedisClient = { on<T extends keyof Events>(event: T, f: (arg: Events[T]) => void): void}let aa: RedisClient = { on: function<T extends keyof Events> (event: T, f: (arg: Events[T]) => void): void { switch (event) { case 'ready': f(undefined as Events[T]); // 无参数 break; case 'error': f(new Error() as Events[T]); // Error参数 break; case 'reconnecting': f({ attempt: 1, delay: 1 } as Events[T]); // 对象参数 break; default: break; } }}aa.on('ready', () => { console.log('Ready event')})aa.on('error', (e: Error) => { console.log('Error event', e)})aa.on('reconnecting', (arg: { attempt: number; delay: number }) => { console.log('Reconnecting event', arg.attempt, arg.delay)})
演示代码:https://tsplay.dev/N5jo0m 从cut以上,可以看到都是正确的,问题在函数sellect 我需要根据第一个参数name: T去判断第二个参数data的类型 提供的name是fixed就限制data是FixedInstance,否则就限制为FollowInstance 问题1:我在sellect参数传参的时候故意 as FollowInstance,在TS中并没有报错
我想通过TypeScript泛型定义函数返回类型。所以R可以是我将定义的任何东西。 <代码>。。。许诺 错误:(29,9)TS2322:类型“字符串”不可分配给类型“R”。“字符串”可分配给类型“R”的约束,但“R”可以用约束“{}”的不同子类型实例化。
我们给identity添加了类型变量。 帮助我们捕获用户传入的类型(比如:),之后我们就可以使用这个类型。 之后我们再次使用了当做返回值类型。现在我们可以知道参数类型与返回值类型是相同的了。 这允许我们跟踪函数里使用的类型的信息。
本节开始介绍 TypeScript 一些进阶知识点,第一个要介绍的泛型是 TypeScript 中非常重要的一个概念,它是一种用以增强函数、类和接口能力的非常可靠的手段。 使用泛型,我们可以轻松地将那些输入重复的代码,构建为可复用的组件,这给予了开发者创造灵活、可重用代码的能力。 1. 慕课解释 泛型在传统的面向对象语言中极为常见,可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据。
定义一个类型 条件1:变量类型是一个字符串。 条件2:变量值不是 get "typescript": "~5.2.2"
我试图在打字稿中使用泛型,这样泛型参数将被用作索引来调用存储在对象中的函数。 我收到的错误是: [ts]不能调用类型缺少调用签名的表达式。类型'((变量:{插入ID:数字;})= 或 “QueryInput[T]”类型的参数不能分配给“{insertId:number;”类型的参数 下面是复制该问题的示例代码: 似乎Typescript引擎无法解析函数的正确签名-尽管肯定只有一个可能的签名(从返回