LINUX.ORG.RU

Присвоить undefined куда не надо в typescript

 , ,


0

2

Это фича?

let x: string;

/*
{
    // Variable 'x' is used before being assigned.
    x = x;
}

{
    // Type 'undefined' is not assignable to type 'string'.
    x = undefined;
}

{
    // Type 'string | undefined' is not assignable to type 'string'.
    // Type 'undefined' is not assignable to type 'string'.
    let a: (string|undefined)[] = ["a", "b", "c"];
    x = a[0];
}
*/

{
    // Успех
    let a: string[] = ["a", "b", "c"];
    x = a[100];
}

if (x === undefined) {
    console.log("WTF?");
}

Ответ на: комментарий от dib2

потому что в string[] длина не известна.

Да и фиг бы с длиной массива. Со словарём то же самое происходит.

let cache: {[key: string]: string} = {};

let x: string = cache['hello'];

if (x === undefined) {
    throw Error('WTF?');
}

Известно, что операция может вернуть string или undefined, но всем видимо пофиг.

suuaq ()
Ответ на: комментарий от suuaq

Да и фиг бы с длиной массива. Со словарём то же самое происходит.

И, что тебе неясно? В этой дристне типизация прикручена сверху и никак семантику жс не отражает. Ты написал string => string - оно будет считать так. Что там происходим снизу - ему неважно.

Осознай фундаментальное отличие описательной типизации - она не влияет на семантику, т.е. не определяет её. Есть ты написал string - это правило для тайпчекера, а не для языка.

Поэтому это твоя задача - описывать семантику базы правильно. Ты описал её неверно и получил проблемы. Пиши string|undefined.

Известно, что операция может вернуть string или undefined, но всем видимо пофиг.

Типизации пофиг на то, что происходит снизу - это базовое её свойство, но об этом я тебе писал выше. Это не баг - это «фича». Вернее следствие убогости подхода.

trai_kiyaan ()
Ответ на: комментарий от trai_kiyaan

В этой дристне типизация прикручена сверху и никак семантику не отражает.

Что верно то верно

#include <stdio.h> 
int main() 
{ 
    int arr[] = {1,2,3,4,5}; 
    printf("arr [0] is %d\n", arr[0]); 
      
    // arr[10] is out of bound 
    printf("arr[10] is %d\n", arr[10]); 
    return 0; 
} 
Deleted ()
Ответ на: комментарий от Deleted

Так ты еще и в шары долбишься

Ну дак что? Уже обделался? Иди обосновывай потуги - каким образом то, что ты высрал имеет отношение к теме и что из высера вообще следует. Действуй, клоун.

trai_kiyaan ()