🔎 搜索词
字符串补全 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'
1条答案
按热度按时间ruarlubt1#
@RyanCavanaugh 我可以在某个时候尝试一下。你认为更多的调用应该在这里表现得像JSX,并且这些补全应该是重载感知的吗?