Как предотвратить неявное преобразование из 'any' при вызове функции в Typescript - PullRequest
0 голосов
/ 19 ноября 2018

Рассмотрим следующий машинописный код:

function eatString(str: string){
    console.log(str);
}

const anyObject: any = {
    junk: 3425234,
};

eatString(anyObject); // Compiles ok - by why?
eatString({something: "abc"}); // Doesn't compile - as expected

Есть ли способ запретить функции eatString(str: string) принимать аргумент any с помощью параметров tsconfig или tslint или иным образом?

Сначала я подумал, что noImplicitAny может помочь, но после того, как я попробовал его и просмотрел документацию, это не то, что я думал. no-any не вариант для меня, так как я все еще хочу иметь возможность использовать any в некоторых случаях.

Если это невозможно, есть ли какая-то причина, по которой я скучаю, почему? Я не работал над надписью / javascript очень долго, но я уже несколько раз замечал некоторые проблемы, которые можно было бы предотвратить.

1 Ответ

0 голосов
/ 19 ноября 2018

any по определению можно назначить любому другому типу, поэтому при передаче anyObject параметру str он будет совместим согласно этому правилу.

Вам следует избегать использования anyесли это абсолютно необходимо.Если вы не знаете тип, который вы должны использовать unknown, который не совместим с другими типами без охраны или подтверждения (см. здесь для различий с any)

function eatString(str: string){
    console.log(str);
}

const anyObject: unknown = {
    junk: 3425234,
};

eatString(anyObject); // error now

В этом частном случае вы просто должны позволить компилятору выводить тип для anyObject

function eatString(str: string){
    console.log(str);
}

const anyObject = { // inferred as { junk : number }
    junk: 3425234,
};

eatString(anyObject); // error now

. Вы можете использовать tslint для запрета использования any в качестве аннотации типа (используя thisправило ), но any может по-прежнему просачиваться из внешних API.

...