Cái gì không thể gán cho tham số của kiểu không bao giờ lỗi trong bản in?


162

Mã là:

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

Tôi nhận được lỗi TS sau:

[ts] Đối số của loại 'chuỗi' không thể gán cho tham số của loại 'không bao giờ'.

Tôi đang làm gì sai? Đây có phải là một lỗi?

Câu trả lời:


251

Tất cả bạn phải làm là xác định của bạn resultnhư là một chuỗi chuỗi, như sau:

const result : string[] = [];

Không xác định kiểu mảng, theo mặc định nó sẽ là never. Vì vậy, khi bạn cố gắng thêm một chuỗi vào nó, đó là một kiểu không khớp và do đó, nó đã đưa ra lỗi mà bạn đã thấy.


6
Điều đó có vẻ kỳ quái với tôi, tại sao mặc định never[]? có bao giờ sử dụng cho điều đó ngoại trừ "một mảng sẽ LUÔN trống không?"
Vincent Buscarello

6
Tôi hoàn toàn đồng ý bởi vì, thành thật mà nói, tôi không thể nghĩ về trường hợp sử dụng rằng một mảng nevers sẽ hữu ích. Nhưng trong khi xem xét nó tôi đã thấy câu trả lời này có thông tin tuyệt vời.
Tha'er M. Al-Ajlouni

8
Không phải loại mặc định là "bất kỳ"? Khi bạn khai báo một biến ( let x;) nó là kiểu anytheo mặc định. Không phải never.
Shachar Har-Shuv

1
Chắc chắn sẽ mong đợi một mảng mà không có loại any[]. Đã ngạc nhiên khi nó never[]làm cho nó vô dụng. Không trực quan. Cảm ơn câu trả lời. chỉnh sửa: ngữ pháp
Igor Malyk

4
@VincentBuscarello Tôi đoán, điểm chính của mặc định đó là tạo một cái để luôn thêm các kiểu vào mảng của chúng; nhưng thông báo lỗi chắc chắn không hữu ích.
YakovL

27

Một cách khác là:

const result = [] as  any;

8
Trên thực tế, sử dụng anykhông phải là một lựa chọn tốt, vì về cơ bản nó sẽ tắt mọi tính năng TypeScript. Đó là một cách giải quyết và có thể dẫn đến các lỗi khác nhau.
Tomek Buszewski

1
Đúng. Nhưng đôi khi không có gì khác hoạt động đặc biệt là khi bạn đang làm việc với các thư viện của bên thứ ba ..
neomib

14

Đây dường như là một hồi quy gần đây hoặc một số hành vi lạ trong bản thảo. Nếu bạn có mã:

const result = []

Thông thường nó sẽ được xử lý như thể bạn đã viết:

const result:any[] = []

tuy nhiên, nếu bạn có cả noImplicitAnyFALSE, strictNullChecks TRUE trong tsconfig, thì nó được coi là:

const result:never[] = []

Hành vi này bất chấp tất cả logic, IMHO. Bật kiểm tra null thay đổi các loại mục nhập của một mảng ?? Và sau đó bật noImplicitAnythực sự khôi phục việc sử dụng anymà không có bất kỳ cảnh báo nào ??

Khi bạn thực sự có một mảng any, bạn không cần phải chỉ ra nó với mã bổ sung.


10

Tôi đã có cùng một lỗi Trong ReactJS chức năng statless khi sử dụng ReactJs Hook useState . Tôi muốn đặt trạng thái của một mảng đối tượng, vì vậy nếu tôi sử dụng cách sau

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

và cập nhật trạng thái như thế này:

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

Tôi đã nhận được lỗi:

Đối số của loại '{id: number; text: any} 'không thể gán cho tham số loại' never '

nhưng nếu làm như thế này,

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

Lỗi không còn nhưng có một mục ở 0 chỉ mục không có bất kỳ dữ liệu nào (không muốn điều đó).

Vì vậy, giải pháp tôi tìm thấy là:

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

7

Tôi đã gặp lỗi tương tự trong thành phần chức năng ReactJS, sử dụng hook ReactJS useState. Giải pháp là khai báo loại useState khi khởi tạo:

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

3

Tôi đã có thể vượt qua điều này bằng cách sử dụng từ khóa Array thay vì dấu ngoặc rỗng:

const enhancers: Array<any> = [];

Sử dụng:

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

2

Bạn cần gõ resultvào một chuỗi các chuỗi const result: string[] = [];.



1

Xóa "rictNullChecks": true khỏi "Trình biên dịch" hoặc đặt thành sai trong tệp tsconfig.json của ứng dụng Ng của bạn. Những lỗi này sẽ biến mất như mọi thứ và ứng dụng của bạn sẽ biên dịch thành công.

Disclaimer : Đây chỉ là một cách giải quyết. Lỗi này chỉ xuất hiện khi kiểm tra null không được xử lý đúng cách, trong mọi trường hợp không phải là cách tốt để hoàn thành công việc.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.