Typescript 修复泛型与隐藏实现的类型兼容性

Typescript 修复泛型与隐藏实现的类型兼容性,typescript,generics,Typescript,Generics,我试图创建一个Maybe/Optional/anywhere类来代替null/undefined,我遇到了一个奇怪的问题,我的泛型类在技术上与任何类型都兼容。我的问题是我能做到 let a: Maybe<boolean> = Maybe.of(true); let b: Maybe<number> = Maybe.of(1); a = b; // No error 让a:Maybe=Maybe.of(true); 设b:Maybe=Maybe.of(1); a=b;//

我试图创建一个Maybe/Optional/anywhere类来代替null/undefined,我遇到了一个奇怪的问题,我的泛型类在技术上与任何类型都兼容。我的问题是我能做到

let a: Maybe<boolean> = Maybe.of(true);
let b: Maybe<number> = Maybe.of(1);
a = b; // No error
让a:Maybe=Maybe.of(true);
设b:Maybe=Maybe.of(1);
a=b;//无误
我知道为什么会这样。我对Maybe的定义没有结构来区分它

导出抽象类{
抽象地图(地图绘制者:(T)=>R):可能;
抽象平面图(mapper:(T)=>Maybe):Maybe;
//只有抽象函数
}
类可能只是扩展{
//实施
}
课堂上可能什么都没有{
//实施
}

有人知道你是怎么做到的吗?我错过了一些超级简单的东西?似乎只有函数的任何接口都会出现此问题。

您需要实际使用
T
。例如,
map
的定义实际上没有使用
T
您声明了一个名为
T
的参数,而不是
T
类型的参数

export abstract class Maybe<T> {
  abstract map<R>(mapper: (v:T) => R): Maybe<R>;
  abstract flatMap<R>(mapper: (v:T) => Maybe<R>): Maybe<R>;
  // nothing but abstract functions
}

let a: Maybe<boolean>;
let b: Maybe<number>;
a = b; //error
导出抽象类{
抽象地图(制图者:(v:T)=>R):可能;
抽象平面图(mapper:(v:T)=>Maybe):Maybe;
//只有抽象函数
}
a:也许吧;
b:也许吧;
a=b//错误

好的,我的问题是我定义的函数类型基本上是错误的。那么我一直在做什么?它只是假设了什么吗?地图(地图绘制者:(T:any)=>R):可能@但我想是的,它假设任何类型的。你可以使用
noImplicitAny
来避免这样的错误。我很生气,因为我太笨了,没有弄明白这一点。我原以为我没有什么特别之处,但我却没有什么特别之处。谢谢你指出这一点。我觉得我应该为浪费时间道歉,哈哈。
export abstract class Maybe<T> {
  abstract map<R>(mapper: (v:T) => R): Maybe<R>;
  abstract flatMap<R>(mapper: (v:T) => Maybe<R>): Maybe<R>;
  // nothing but abstract functions
}

let a: Maybe<boolean>;
let b: Maybe<number>;
a = b; //error