Bỏ qua lỗi typcript Lỗi thuộc tính không tồn tại trên giá trị của kiểu loại


227

Trong tòa nhà VS2013 dừng khi tsc thoát với mã 1. Đây không phải là trường hợp trong VS2012.

Làm cách nào để chạy giải pháp của tôi trong khi bỏ qua lỗi tsc.exe?

Tôi nhận được nhiều The property 'x' does not exist on value of type 'y'lỗi, mà tôi muốn bỏ qua khi sử dụng các hàm javascript.

Câu trả lời:


303

Tôi biết câu hỏi đã bị đóng nhưng tôi thấy nó đang tìm kiếm cùng loại TypeScriptException, có thể một số người khác đã trả lời câu hỏi này để tìm kiếm vấn đề này.

Vấn đề nằm ở việc gõ TypeScript bị thiếu:

var coordinates = outerElement[0].getBBox();

Ném The property 'getBBox' does not exist on value of type 'HTMLElement'.


Cách dễ nhất là gõ rõ ràng biến như any

var outerHtmlElement: any = outerElement[0];
var coordinates = outerHtmlElement.getBBox();

Chỉnh sửa, cuối năm 2016

Vì toán tử đúc được ưa thích của TypeScript 1.6 nên ascác dòng này có thể được ghép thành thanh lịch:

let coordinates = (outerElement[0] as any).getBBox();


Các giải pháp khác

Tất nhiên, nếu bạn muốn làm đúng, đôi khi là quá mức cần thiết, bạn có thể:

  1. Tạo giao diện riêng mà chỉ cần mở rộng HTMLElement
  2. Giới thiệu cách gõ riêng kéo dài HTMLElement

14
Bạn cũng có thể tạo một giao diện mở rộng HTMLElementvà có thuộc tính bổ sung getBBox. Bằng cách đó bạn vẫn nhận được mã hoàn thành trên các thuộc tính khác.
thetallweek

thay vì đúc vào bất kỳ để getBBoxcó phương pháp nào để đúc tự do? muốn tìm hiểu các loại getBBox?
Pardeep Jain

FE: Nếu getBBoxcó thể, HTMLElementbạn có thể truyền đối tượng cho nó var typedElement = <HTMLElement> outerHtmlElement;.
michalczukm

4
đẹp! var coordinates = (<any>outerElement[0]).getBBox();
Bowastya 06/05/2016

1
Điều này thực sự không trả lời câu hỏi: "Làm thế nào để khắc phục lỗi"
Petr Peller

122

Giải pháp nhanh và bẩn là sử dụng một cách rõ ràng any

(y as any).x

"Ưu điểm" là, dàn diễn viên rõ ràng, điều này sẽ biên dịch ngay cả với bộ noImplicitAnycờ.

Giải pháp thích hợp là cập nhật tệp định nghĩa đánh máy.

Xin lưu ý rằng, khi bạn chuyển một biến sang any, bạn chọn không tham gia kiểm tra biến đó.


Vì tôi đang ở chế độ từ chối trách nhiệm, việc truyền hai lần thông qua anykết hợp với giao diện mới, có thể hữu ích trong các tình huống khi bạn

  • không muốn cập nhật một tập tin đánh máy bị hỏng
  • đang vá khỉ

Tuy nhiên, bạn vẫn muốn một số hình thức gõ.

Giả sử bạn muốn vá định nghĩa của thể hiện ycủa loại OrginalDefvới xthuộc tính mới của loại number:

const y: OriginalDef = ...

interface DefWithNewProperties extends OriginalDef {
    x: number
}

const patched = y as any as DefWithNewProperties

patched.x = ....   //will compile

cảm ơn vì điều này đã giúp: nhập http = Yêu cầu ('http'); máy chủ var = http như bất kỳ; máy chủ. Máy chủ (ứng dụng); // bỏ qua lỗi ts!
scape

Tôi đã sử dụng điều này trong "đảm bảo không tìm thấy tài sản trên NodeRequire". vì vậy tôi đã khai báo biến yêu cầu của mình trên NodeRequired và (yêu cầu là bất kỳ) .ensure cho thuộc tính. Hi vọng điêu nay co ich.
Juni Brosas

61

Bạn cũng có thể sử dụng thủ thuật sau:

y.x = "some custom property"//gives typescript error

y["x"] = "some custom property"//no errors

Lưu ý, để truy cập xvà không gặp lỗi bản in nữa, bạn cần phải viết nó như thế y["x"], không y.x. Vì vậy, từ quan điểm này, các lựa chọn khác là tốt hơn.


4
Có ai biết tại sao điều này hoạt động, và nếu điều này có bất kỳ sự phân nhánh hoặc lợi ích tiềm năng nào so với việc khai báo đối tượng ban đầu là :any?
mcheah

Nó sẽ có lợi ích rõ ràng của việc giữ các kiểu chữ, thay vì đúc cho bất kỳ. Tôi muốn biết lý do tại sao điều này không đưa ra cảnh báo nhưng truy cập trực tiếp thì không ..
Powderham

38

Có một số cách để xử lý vấn đề này. Nếu đối tượng này có liên quan đến một số thư viện bên ngoài, giải pháp tốt nhất sẽ là tìm tệp định nghĩa thực tế (kho lưu trữ tuyệt vời ở đây ) cho thư viện đó và tham chiếu nó, ví dụ:

/// <reference path="/path/to/jquery.d.ts" >

Tất nhiên, điều này không áp dụng trong nhiều trường hợp.

Nếu bạn muốn 'ghi đè' hệ thống loại, hãy thử như sau:

declare var y;

Điều này sẽ cho phép bạn thực hiện bất kỳ cuộc gọi nào bạn muốn var y.


5
Nên có /// <reference path="/path/to/jquery.d.ts" />thẻ tự đóng ở cuối
tic

Tôi đang sử dụng VS2015 và làm theo hướng dẫn này cho góc cạnh tôi không có jquery.d.tstệp trong dự án của mình
Dimple

@ Đơn giản là npm install -g tsdsautsd install jquery
Akash

Tùy chọn thứ hai (khai báo var y) hoạt động rất tốt nếu bạn đang di chuyển từ JavaScript sang TypeScript và muốn tránh lỗi TS2304 vì JavaScript cũ của bạn đang tham chiếu một biến trong tệp JavaScript khác.
yesman

Cảm ơn! Đối với tôi, vấn đề là với Jest, const mockPrompt: any = jest.spyOn (step, 'prompt');
Đánh dấu Robson

18

Khi TypeScript nghĩ rằng thuộc tính "x" không tồn tại trên "y" , thì bạn luôn có thể chuyển "y" thành "bất kỳ", điều này sẽ cho phép bạn gọi bất cứ thứ gì (như "x") trên "y".

Học thuyết

(<any>y).x;

Ví dụ thế giới thực

Tôi đã gặp lỗi "TS2339: Tên 'thuộc tính' không tồn tại trên loại 'Hàm'" cho mã này:

let name: string = this.constructor.name;

Vì vậy, tôi đã sửa nó bằng:

let name: string = (<any>this).constructor.name;

1
Không làm việc với siêu. Nếu bạn mở rộng một lớp bằng cách sử dụng các kiểu chữ và tác giả sẽ quên một phương thức công khai, bạn sẽ gặp khá nhiều khó khăn. Bạn phải thêm nó vào định nghĩa loại, bị dừng trong lần cài đặt npm tiếp theo, buộc bạn phải tạo một yêu cầu kéo hoặc thông báo cho tác giả, đây có thể là một điều tốt nhưng là một nỗi đau.
Corey Alix

15

Có một vấn đề trong Angular2, tôi đã sử dụng bộ nhớ cục bộ để lưu thứ gì đó và nó sẽ không cho phép tôi.

Các giải pháp:

Tôi đã có localStorage.city -> error -> Property 'city' does not exist on type 'Storage'.

Cách khắc phục:

localStorage ['city']

(localStorage) .city

(localStorage như bất kỳ) .city


Tùy chọn thứ hai có vẻ mát mẻ, nhưng dường như không thực hiện công việc nữa. Hoạt động nếu bạn tiền tố một đối tượng với <any>- (<any>localStorage).city.
jayarjo

Tôi biết điều này đã cũ nhưng ví dụ hàng đầu của bạn chỉ làm việc cho tôi .. Tốt lắm.
MacD

4

Một sửa chữa nhanh chóng, nơi không có gì khác làm việc:

const a.b = 5 // error

const a['b'] = 5 // error if ts-lint rule no-string-literal is enabled

const B = 'b'
const a[B] = 5 // always works

Thực hành không tốt nhưng cung cấp một giải pháp mà không cần phải tắt không có chuỗi


Tôi cũng làm điều này nhưng một số nền tảng (như Google Cloud) sẽ đưa ra một thông báo cảnh báo cho thấy ab tốt hơn ['b']. Bạn có biết tại sao không?
Jonathan

1
Không chắc chắn nhưng bạn có thể, ví dụ, trong tslint.json, thay đổi các tùy chọn sao cho nó thích ab
danday74

3

Tôi biết bây giờ là năm 2020, nhưng tôi không thể thấy câu trả lời thỏa mãn phần "bỏ qua" của câu hỏi. Hóa ra, bạn có thể bảo TSLint làm điều đó bằng cách sử dụng một lệnh;

// @ts-ignore
this.x = this.x.filter(x => x.someProp !== false);

Thông thường, điều này sẽ gây ra lỗi, nói rằng 'someProp không tồn tại trên loại'. Với các bình luận, lỗi đó biến mất.

Điều này sẽ ngăn chặn bất kỳ lỗi nào được đưa ra khi biên dịch và cũng sẽ ngăn IDE của bạn phàn nàn với bạn.


0

Trong dự án cụ thể của tôi, tôi không thể làm cho nó hoạt động và được sử dụng declare var $;. Không phải là một giải pháp sạch / được đề xuất, nó không nhận ra các biến JQuery, nhưng tôi không có lỗi sau khi sử dụng nó (và phải để các bản dựng tự động của tôi thành công).


0

Tôi đã có thể vượt qua điều này trong bản thảo bằng cách sử dụng một cái gì đó như:

let x = [ //data inside array ];
let y = new Map<any, any>();
for (var i=0; i<x.length; i++) {
    y.set(x[i], //value for this key here);
}

Đây dường như là cách duy nhất mà tôi có thể sử dụng các giá trị bên trong X làm khóa cho bản đồ Y và biên dịch.

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.