O que é o erro "não atribuível ao parâmetro do tipo nunca" no texto datilografado?


162

O código é:

const foo = (foo: string) => {
  const result = []
  result.push(foo)
}

Eu recebo o seguinte erro TS:

[ts] O argumento do tipo 'string' não é atribuível ao parâmetro do tipo 'never'.

O que estou fazendo de errado? Isso é um inseto?

Respostas:


251

Tudo o que você precisa fazer é definir o seu resultcomo uma matriz de strings, como o seguinte:

const result : string[] = [];

Sem definir o tipo de matriz, por padrão será never. Portanto, quando você tentou adicionar uma string, houve uma incompatibilidade de tipo e, portanto, gerou o erro que você viu.


6
Isso me parece bizarro, por que usar como padrão never[]? existe alguma utilidade para isso, exceto "uma matriz que SEMPRE estará vazia?"
Vincent Buscarello

6
Concordo totalmente porque, para ser honesto, não consigo pensar em um caso de uso em que uma matriz de nevers seja útil. Mas, enquanto olhava para ele, me deparei com essa resposta, que tem ótimas informações.
Tha'er M. Al-Ajlouni 01/03/19

8
O tipo padrão não deve ser "any"? Quando você declara uma variável ( let x;), ela é do tipo anypor padrão. Não never.
Shachar Har-Shuv

1
Definitivamente esperaria que um array sem tipo fosse any[]. Fiquei surpreso que foi o never[]que o torna inútil. Não intuitivo. Obrigado pela resposta. edit: gramática
Igor Malyk

4
@VincentBuscarello Eu acho que o ponto principal desse padrão é fazer com que alguém sempre adicione tipos às suas matrizes; mas a mensagem de erro definitivamente não é útil.
YakovL

27

Outra maneira é:

const result = [] as  any;

8
Na verdade, usar anynão é uma boa opção, porque basicamente desativa todos os recursos do TypeScript. É uma solução alternativa e pode levar a vários erros.
Tomek Buszewski

1
Sim. Mas às vezes nada mais funciona, especialmente quando você está trabalhando com bibliotecas de terceiros ..
neomib

14

Parece ser uma regressão recente ou algum comportamento estranho no texto datilografado. Se você tem o código:

const result = []

Geralmente seria tratado como se você escrevesse:

const result:any[] = []

no entanto, se você tiver ambos noImplicitAnyFALSE e strictNullChecks TRUE no seu tsconfig, ele será tratado como:

const result:never[] = []

Esse comportamento desafia toda a lógica, IMHO. Ativar verificações nulas altera os tipos de entrada de uma matriz? E, em seguida, ligar noImplicitAnyrealmente restaura o uso de anysem avisos?

Quando você realmente tem uma matriz de any, você não precisa indicá-la com código extra.


10

Eu estava tendo o mesmo erro Na função sem estado do ReactJS enquanto usava o ReactJs Hook useState . Eu queria definir o estado de uma matriz de objetos, portanto, se eu usar da seguinte maneira

const [items , setItems] = useState([]);

e atualize o estado assim:

 const item = { id : new Date().getTime() , text : 'New Text' };
 setItems([ item , ...items ]);

Eu estava recebendo erro:

Argumento do tipo '{id: number; text: any} 'não é atribuível ao parâmetro do tipo' never '

mas se fizer assim,

const [items , setItems] = useState([{}]);

O erro desapareceu, mas há um item no índice 0 que não possui nenhum dado (não o deseja).

então a solução que encontrei é:

const [items , setItems] = useState([] as any);

7

Eu recebi o mesmo erro no componente de função ReactJS, usando o gancho ReactJS useState. A solução foi declarar o tipo de useState na inicialização:

const [items , setItems] = useState<IItem[]>([]); // replace IItem[] with your own typing: string, boolean...

3

Consegui superar isso usando a palavra-chave Array em vez de colchetes vazios:

const enhancers: Array<any> = [];

Usar:

if (typeof devToolsExtension === 'function') {
  enhancers.push(devToolsExtension())
}

2

Você precisa digitar resultem uma matriz de string const result: string[] = [];.



1

Remova "strictNullChecks": true de "compilerOptions" ou defina-o como false no arquivo tsconfig.json do seu aplicativo Ng. Esses erros desaparecerão como qualquer coisa e seu aplicativo será compilado com êxito.

Isenção de responsabilidade : esta é apenas uma solução alternativa. Este erro aparece apenas quando as verificações nulas não são tratadas corretamente, o que, de qualquer forma, não é uma boa maneira de fazer as coisas.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.