typescript 泛型+混合类型接口的学习困惑?

interface Counters {
  (start:number):string,
  interval:number,
  reset():void;
}

let Demoter:Counters =function (start:number) {

} as Counters
Demoter.interval = 123;
Demoter.reset = function () {

}
console.dir('Demoter:',Demoter);
//加入了泛型之后就出了一些问题是不是不能这样定义接口?
interface Countere<T> {
  (start: T): string;
  interval: T;
  reset(): void;
}

function getCounter(): Countere<number> {
  let counter = function (start: number) { };
//let counter = <Countere>function (start: number) { };//加上泛型说明下面不报错有报泛型类型“Countere<T>”需要 1 个类型参数。加一个类型参数我也不知道写的对不对,没看见文档上给例子,给<Countere><number>又开始报错类型 "(start: number) => void" 到类型 "number" 的转换可能是错误的,因为两种类型不能充分重叠。如果这是有意的,请先将表达式转换为 "unknown"。
//真的是崩溃,是我文档看的不行吗😂
  counter.interval = 123;//报错 类型“(start: number) => void”上不存在属性“interval”
  counter.reset = function () { };
  return counter;
}

let c = getCounter();
c(10);
c.reset();
c.interval = 5.0;

这个接口里面定义函数加上函数的属性变量混合类型,是不是不能加泛型啊,要么就不能写成函数形式,写成类?
请大佬指条明路啊,我感觉我的官方文档是个假的😂,有好的文档推荐也可以贴出来

阅读 4.1k
2 个回答

这么改就好了

function getCounter(): Countere<number> {
// 采用 as 断言
  let counter = function (start: number) { } as Countere<number>;

不采用类型断言,会触发 ts 的隐式推断,判断类型为 (start: number) => void
所以会报对应错误

Countere<T> 声明了一个参数是 T 类型,返回值是 string 的混合对象函数,还有拥有 interval 属性和 reset() 方法。

let counter = function (start: number) { } 这里定义了一个函数,但是这个函数是 (t: T) => void 类型的,返回类型与 Countere 声明的函数类型不符。

只需要给 counter 一个 string 类型的返回值就好,比如

let counter = function (start: number) { return "hello"; }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进