TypeScript 此类型应使用内置关键字

30byixjq  于 4个月前  发布在  TypeScript
关注(0)|答案(6)|浏览(54)

建议

🔍 搜索词

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具有这样的假定义,那将是非常令人困惑的,并且会模糊内在和非内在之间的区别。

hgb9j2n6

hgb9j2n61#

具有讽刺意味的是,Union[None] 与TypeScript中的never几乎完全相同,即一个空联合。type never = undefined似乎不是一个很好的比较,因为undefined是一个单元类型,而不是一个底层类型。

x759pob2

x759pob22#

在Python中,Union[None] 实际上并不表示一个空的联合。它是一个包含一个类型(None)的联合,所以如果你尝试重新创建它,它的行为会有所不同:

from typing import Union, NoReturn

NoReturn2 = Union[None]

foo: NoReturn
foo2: NoReturn2

bar: int = foo # no error
bar2: int = foo2 # error: Incompatible types in assignment (expression has type "None", variable has type "int")

这就是我所说的隐秘的内在行为。ThisType 看起来像是在语言中实现的,但如果你尝试重新创建它,它的魔法就会消失:

interface Foo {
    a: () => void
    foo: number
}

interface Bar {
    a: () => void
    bar: number
}

interface ThisType2<T> { }

type Baz = Foo & ThisType<Bar>
type Baz2 = Foo & ThisType2<Bar>

const foo: Baz = {
    foo: 1,
    a() {
        this.bar //no error
    }
}
const foo2: Baz2 = {
    foo: 1,
    a() {
        this.bar //Property 'bar' does not exist on type 'Foo & ThisType2<Bar>'.(2339)
    }
}

我原以为ThisType可能是增强了已经在其他地方定义的接口?但就我所知,并不是这样。

y4ekin9u

y4ekin9u3#

Union[None] 不是一个空的联合,它是一个 NoneType 的联合。一个空的联合会像 Union[] 这样,这是一个语法错误。
Python 类型机制(如 Union)将 None 转换为 NoneType(Nonebuiltins.type)。
Union 工厂检查是否只有一个参数,在这种情况下,只需返回该参数,而不是该参数的联合。
因此,尽管它可能看起来是这样,但 Union[None] 仍然返回 builtins.NoneType

qc6wkl3g

qc6wkl3g4#

我认为这不会成为问题,但似乎更简单的解决方法是在声明上方添加一条注解,因为这两种声明形式都不会告诉你发生了什么。
为什么大家都在谈论Python联合体? 😅

pepwfjgg

pepwfjgg5#

由于Python的类型提示令人尴尬,而不是基于实际的。而这个特定的定义看起来就像是直接从Python中出来的。

x3naxklr

x3naxklr6#

我猜intrinsic告诉用户里面有魔法,至少它不是空界面(这是any)。这只是一件很小的事情,可以但不一定必须去做。

相关问题