typescript - 'Thuộc tính không tồn tại trên kiểu 'never''
Điều này tương tự với #40796374 nhưng cái đó liên quan đến các kiểu, trong khi tôi đang sử dụng các giao diện.
Cho đoạn mã dưới đây:
interface Foo {
name: string;
}
function go() {
let instance: Foo | null = null;
let mutator = () => {
instance = {
name: 'string'
};
};
mutator();
if (instance == null) {
console.log('Instance is null or undefined');
} else {
console.log(instance.name);
}
}
Tôi nhận được lỗi nói rằng 'Thuộc tính 'name' không tồn tại trên kiểu 'never'.
Tôi không hiểu làm thế nào một trường hợp lại có thể là 'không bao giờ'. Có ai có thể giải thích điều này không?
Câu trả lời #1
Nếu bạn viết component dưới dạng React.FC, và sử dụng useState(), bạn có thể viết nó như sau:
const [arr, setArr] = useState<any[]>([])
Câu trả lời #2
Tôi đã gặp cùng một lỗi và thay dấu chấm bằng ký hiệu dấu ngoặc để bỏ qua nó.
ví dụ:
obj.name -> obj['name']
Câu trả lời #3
Bởi vì bạn đang gán instance bằng null. Trình biên dịch suy ra rằng nó sẽ không bao giờ là gì khác ngoài null. Vì vậy nó giả sử rằng khối else sẽ không bao giờ được thực thi nên instance được gán kiểu là never trong khối else.
Bây giờ nếu bạn không khai báo nó như giá trị nguyên thủy null, và lấy nó bằng bất kỳ cách nào khác (ví dụ: let instance: Foo | null=getFoo();), bạn sẽ thấy rằng instance sẽ là null bên trong khối if và là Foo bên trong khối else.
Kiểu never tài liệu: https://www.typescriptlang.org/docs/handbook/basic-types.html#never
Chỉnh sửa:
Vấn đề trong ví dụ đã cập nhật thực ra là một vấn đề chưa được giải quyết với trình biên dịch. Xem:
https://github.com/Microsoft/TypeScript/issues/11498 https://github.com/Microsoft/TypeScript/issues/12176
Câu trả lời #4
nếu bạn đang sử dụng hook useRef của React với TypeScript, thay vì sử dụng any bạn có thể làm như sau.
const ref = useRef<HTMLInputElement>(null);
Câu trả lời #5
Điều này dường như giống với vấn đề này: Sai "Thuộc tính không tồn tại trên kiểu 'never'" khi thay đổi giá trị bên trong callback với strictNullChecks, vấn đề này đã bị đóng vì trùng lặp với vấn đề này (thảo luận): Những thỏa hiệp trong Phân tích Luồng Điều khiển.
Cuộc thảo luận đó khá dài, nếu bạn không thể tìm được giải pháp tốt ở đó, bạn có thể thử cách này:
if (instance == null) {
console.log('Instance is null or undefined');
} else {
console.log(instance!.name); // ok now
}
Câu trả lời số 6
Trong trường hợp của tôi, khi tôi khởi tạo mảng. Tôi đã sử dụng:
selectedActors: any = [];
Vì vậy đầu tiên nó làm cho nó trở nên "động"
Câu trả lời số 7
Đối với nhà phát triển TypeScript sử dụng React... nếu bạn sử dụng hook React.useRef() thay vì gán trước null, hãy khai báo và sử dụng kiểu biến là any.
Ví dụ :
const initialRef: any = null;
const ref = React.useRef(initialRef);
Câu trả lời #8
Đối với tôi, đoạn mã sau hoạt động:
const [disc, setDisc] = useState<any[]>([]);
Những gì tôi đã thấy cho đến nay như sau: Khi bạn không chỉ định loại mà bạn đang truyền vào useState(), nó sẽ suy đoán rằng đó là loại never. Bằng cách làm cho nó sử dụng any[], bạn có thể truyền dữ liệu khi nó được yêu cầu.
