TypeScript 在关键字补全中

gmxoilav  于 4个月前  发布在  TypeScript
关注(0)|答案(3)|浏览(62)

建议

🔍 搜索词

在关键字补全中
在关键字建议中
在关键字智能感知中

✅ 可实现性检查清单

我的建议满足以下准则:

  • [z] 这不会对现有的TypeScript/JavaScript代码造成破坏性的更改
  • [z] 这不会改变现有JavaScript代码的运行时行为
  • [z] 这可以在不根据表达式的类型发出不同的JS的情况下实现
  • [z] 这不是一个运行时特性(例如库功能、具有JavaScript输出的非ECMAScript语法、JavaScript的新语法糖等)
  • [z] 这个特性会与 TypeScript's Design Goals 的其他部分一致。

⭐ 建议

Typescript文档指出, in 运算符通常用于对象类型缩小,但有时您可能会忘记缩小后想要获取的属性名称。在这些位置添加额外的智能感知可以帮助解决问题。
TLDR问题:在使用 in 关键字的左侧时,不知道要完成什么。

📃 激励示例

declare const foo: { a: boolean, b: string } | { a: number, c: number }

if ('' in foo) {}

这个实现非常简单,我已经在我的项目中实现了它,但也决定尽可能提供更多的信息:

右侧补全项中的数字表示类型索引,从联合的实际位置开始(从1开始)。
当选择特定的键时,补全小部件会在每个联合类型中显示该键的类型。星号表示该键可以缩小类型(不在所有联合类型的中都存在)。
我知道有时候这些数字可能会让人困惑,例如:

type Fish = /*1*/{ swim: () => void };
type Bird = /*2*/{ fly: () => void } | /*3*/{ swim: () => void };
type Human = /*4*/{ swim?: () => void; fly?: () => void };
 
function move(animal: Fish | Bird | Human) {
  if ("" in animal) {
    animal;
  } else {
    animal;
  }
}

我想知道是否有必要显示这样的信息,虽然对我来说非常有用,可能对其他用户来说会混淆。但是我认为至少应该为每个补全显示文档,但可能是其他格式。例如,对于上面示例中的 swim 补全:

From Fish: () => void

From Bird[2]: () => void

From Human: (() => void) | undefined

无论如何,这只是一个建议,所以请告诉我你的想法。最后,我认为应该添加新的补全类型,如 ts.ScriptElementKind.stringNotStrict ,以向客户端展示它实际上接受任意字符串。

💻 用例

h43kikqp

h43kikqp1#

我不确定你是如何确定联合成员的索引号的,但它们非常可能是不稳定的;联合顺序是一个内部实现细节,在足够大的代码库中实际上是随机的(它取决于在编译时首先遇到的类型的顺序,而不是它们在类型注解中出现的顺序)。尝试在你上面的例子中的联合 Fish | Bird | Human 中重新排序-不重新排序那些类型的原始定义-看看会发生什么。

dxpyg8gm

dxpyg8gm2#

type Human = { swim?: () => void; fly?: () => void };

P.S. 我有点想知道你是在哪里找到会飞的人的。把他们放在飞机上不算数😄

at0kjp5o

at0kjp5o3#

type Human = { swim?: () => void; fly?: () => void };

P.S. 我有点想知道你是在哪里找到会飞的人的。把他们放在飞机上不算数😉

看起来他从TS Narrowing文档中找到了例子,但他让一只鸟既能飞又能游泳,这是我迄今为止在问题中看到最有趣的事情😆

此外,仅仅具有星号名称补全功能也非常有用,从未理解过这些随机数字实际上是什么意思🤣

相关问题