建议
🔍 搜索词
thistype intrinsic
✅ 可实现性检查清单
我的建议满足以下准则:
- 这不会对现有的TypeScript/JavaScript代码造成破坏性的更改
- 这不会改变现有JavaScript代码的运行时行为
- 这可以在不根据表达式的类型发出不同的JS的情况下实现
- 这不是一个运行时特性(例如库功能、JavaScript输出的非ECMAScript语法、JS的新语法糖等)
- 这个特性将与TypeScript's Design Goals的其他部分保持一致。
⭐ 建议
ThisType
在它的定义中似乎什么都没做,但实际上它具有隐藏的内在功能?因此,我认为它应该使用intrinsic
关键字:
interface ThisType<T> { }
或者更好的是,为什么不在语言中实现它呢?
type ThisType<OldThis, NewThis> = {
[K in keyof OldThis]: OldThis[K] extends (...args: never[]) => unknown
? (this: NewThis, ...args: Parameters<OldThis[K]>) => ReturnType<OldThis[K]>
: OldThis[K]
}
(尽管这可能会破坏现有的代码)
动机
在一个语言中,当一个符号有一个“假”的实现可以查看,但其行为实际上是在其他地方内在地定义的,这是具有误导性的。例如,Python中的NoReturn
类型:
NoReturn = Union[None]
这与其TypeScript等价物一样毫无意义:
type never = undefined
Union[None]
与NoReturn
无关。其行为实际上是在类型检查器(如mypy)中内在地定义的。如果never
具有这样的假定义,那将是非常令人困惑的,并且会模糊内在和非内在之间的区别。
6条答案
按热度按时间hgb9j2n61#
具有讽刺意味的是,
Union[None]
与TypeScript中的never
几乎完全相同,即一个空联合。type never = undefined
似乎不是一个很好的比较,因为undefined
是一个单元类型,而不是一个底层类型。x759pob22#
在Python中,
Union[None]
实际上并不表示一个空的联合。它是一个包含一个类型(None
)的联合,所以如果你尝试重新创建它,它的行为会有所不同:这就是我所说的隐秘的内在行为。
ThisType
看起来像是在语言中实现的,但如果你尝试重新创建它,它的魔法就会消失:我原以为
ThisType
可能是增强了已经在其他地方定义的接口?但就我所知,并不是这样。y4ekin9u3#
Union[None]
不是一个空的联合,它是一个NoneType
的联合。一个空的联合会像Union[]
这样,这是一个语法错误。Python 类型机制(如
Union
)将None
转换为NoneType
(None
的builtins.type
)。而
Union
工厂检查是否只有一个参数,在这种情况下,只需返回该参数,而不是该参数的联合。因此,尽管它可能看起来是这样,但
Union[None]
仍然返回builtins.NoneType
。qc6wkl3g4#
我认为这不会成为问题,但似乎更简单的解决方法是在声明上方添加一条注解,因为这两种声明形式都不会告诉你发生了什么。
为什么大家都在谈论Python联合体? 😅
pepwfjgg5#
由于Python的类型提示令人尴尬,而不是基于实际的。而这个特定的定义看起来就像是直接从Python中出来的。
x3naxklr6#
我猜
intrinsic
告诉用户里面有魔法,至少它不是空界面(这是any
)。这只是一件很小的事情,可以但不一定必须去做。