TypeScript 在JSX属性和对象属性之间,顶级属性上的字符串补全不一致,

iklwldmw  于 6个月前  发布在  TypeScript
关注(0)|答案(1)|浏览(45)

🔎 搜索词

字符串补全 jsx 重载 调用 函数对象 属性

🕗 版本与回归信息

  • 这是我尝试的每个版本中的行为

⏯ Playground链接

https://www.typescriptlang.org/play?ts=5.3.0-dev.20231023#code/JYWwDg9gTgLgBAJQKYEMDG8BmUIjgIilQ3wG4BYAKCoBMk0AbFIuTAVwDsNgIO4YkAZxgAKZgHMAXART4AlNIBuEYDQqU6jZkladuvfkNETp+AEbylKtVSoDhI-PNJwA9K7gByFJ7gAfLzNPWw16JhZ2LhgePnsYACYxKCk4AG84MBwwU1k4AF8FOGVVdU1wnUj9WKNEkzSMrNMLfMLim2pKOMT0zIhsgnwWl3cvHxCy7V0omLgAFSMRXrBBaR7GmUGC6Q42BgZSsMnK6IN5hyWV+qWmzcKdvfUqAB4z+CWAXic3AD5hj29fAFPEEqEA

💻 代码

import React from "react";

declare function test(arg: "a"): void;
declare function test(arg: "b"): void;

test(""); // 'a' | 'b'

declare function test2(arg: { prop: "a" }): void;
declare function test2(arg: { prop: "b" }): void;

test2({ prop: "" }); // 'a'

declare function Test(props: { prop: "a" }): null;
declare function Test(props: { prop: "b" }): null;

<Test prop="" />; // 'a' | 'b'

🙁 实际行为

test2 处仅有 'a' 的补全,但在 Test 处 JSX "call" 处同时列出了 'a''b'

🙂 预期行为

这两者都表示相同的事情 - 一个函数调用。我希望这两个地方的行为保持一致。

关于问题的附加信息

JSX 情况(以及第一个 test 调用)通过 getStringLiteralCompletionsFromSignature。这收集了所有潜在的候选项 - 因此它能够在所有候选项中查找补全。对 test2 的常规调用从 fromContextualType() || fromContextualType(ContextFlags.None) 获取补全,因此它只能基于其中一个重载(第一个)列出补全。
如果我们假设可重载的解决方案更好,那么它是否也应该扩展到处理更深层次的情况,例如这个?

declare function Test2(props: { prop: { deep: "a" } }): null;
declare function Test2(props: { prop: { deep: "b" } }): null;

<Test2 prop={{ deep: "" }} />; // 'a'
ruarlubt

ruarlubt1#

@RyanCavanaugh 我可以在某个时候尝试一下。你认为更多的调用应该在这里表现得像JSX,并且这些补全应该是重载感知的吗?

相关问题