Typoskriptcode, der die Möglichkeit nicht berücksichtigt, dass ein Array-Element möglicherweise undefiniert zurückgibt
P粉824889650
P粉824889650 2023-08-24 12:15:44
0
2
677
<p>Der folgende Code besteht den Typescript-Typprüfer (v2.9.1), löst jedoch zur Laufzeit einen <code>TypeError</code> aus. </p> <pre class="brush:php;toolbar:false;">interface Item { id: string } const list: Item[] = [{ id: 'a' }, { id: 'b' }]; const item = list[3]; // Typ: Item const itemId = item.id; // Typ: string</pre> <p>Da der Zugriff auf ein Element in einem typisierten Array immer <code>undefiniert</code> zurückgeben kann, sollte <code>item</code> <code>item: Item | sein. , was Sie dazu zwingen würde, eine Nullprüfung durchzuführen, nicht wahr? </p> <p>Was mich noch mehr überrascht hat, ist, dass der folgende Code auch die Typprüfung bestanden hat: </p> <pre class="brush:php;toolbar:false;">const item2: Item |. const item2Id = item2.id;</pre> <p>Obwohl die Umwandlung des Rückgabewerts dazu führt, dass die Typprüfung fehlschlägt: </p> <pre class="brush:php;toolbar:false;">const item3 = list[3] as Item undefiniert; const item3Id = item3.id; // [ts] Objekt ist möglicherweise „undefiniert“.</pre> <p>Das Erstellen einer explizit typisierten Accessor-Funktion kann auch die <code>undefinierte</code>-Situation erfassen, führt jedoch zu unnötigem Overhead: </p> <pre class="brush:php;toolbar:false;">const getItem1 = (index: number, items: Item[]): Item |. const item3 = getItem1(3, list); const item3Id = item3 && item3.id;</pre> <p>Ist dies eine bekannte Einschränkung von Typescript? Gibt es ein empfohlenes Muster oder eine empfohlene Bibliothek, um mit dieser Situation umzugehen? </p>
P粉824889650
P粉824889650

Antworte allen(2)
P粉194541072

这是有意的行为。 在TypeScript GitHub存储库上查看此问题的长时间讨论

你的strictNullChecks关闭了;尝试打开它。

P粉330232096

TS 4.1更新:

TypeScript 4.1引入了一个--noUncheckedIndexedAccess编译器标志,实现了在microsoft/TypeScript#13778中提出的建议,以考虑这种情况下的undefined。请注意,该功能不会作为--strict编译选项集的一部分启用,并且被称为“严格的索引签名”,因为它会在程序员可能不希望或期望的情况下发出关于undefined的警告。


TS4.1之前的回答:

您已经发现索引签名不会像可选属性那样将| undefined添加到元素类型中。在microsoft/TypeScript#13778上提出了创建一个编译器选项来实现这一点的建议。您可以阅读该建议中的评论;它们链接到其他问题,但共识是高错误率几乎使其无用。

还提到您可以手动将| undefined添加到元素类型中:

const list: (Item | undefined)[] = [{ id: 'a' }, { id: 'b' }];

这将按您的预期工作,而不会影响整个语言。

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage