TypeScript với KnockoutJS


137

Có mẫu nào sử dụng TypeScript với KnockoutJS không? Tôi chỉ tò mò về cách họ sẽ làm việc cùng nhau?

Biên tập

Đây là những gì tôi có, dường như làm việc

declare var ko: any;
declare var $: any;
class ViewModel {
    x = ko.observable(10);
    y = ko.observable(10);

}

$(() => {
    ko.applyBindings(new ViewModel());
});

Điều này tạo ra Javascript sau:

var ViewModel = (function () {
    function ViewModel() {
        this.x = ko.observable(10);
        this.y = ko.observable(10);
    }
    return ViewModel;
})();
$(function () {
    ko.applyBindings(new ViewModel());
});

6
Tôi đã hơi bối rối bởi từ khóa "khai báo" được sử dụng cùng với "var" cho đến khi tôi tìm thấy phần trên Tuyên bố xung quanh trong thông số kỹ thuật. Làm cho ý nghĩa hoàn hảo bây giờ: typecriptang.org/Content/ .
Rex Miller

2
Trong Bản mô tả 0.9, chúng ta có Generics, cung cấp cho bạn các kiểu quan sát được gõ : ko.observable<number>(10). Tôi đã viết một blogpost với một số thông tin chi tiết hơn: ideaof.andersaberg.com/idea/12/ mẹo
Anders

Câu trả lời:


108

Nhìn vào DefiniteTyped .

"Kho định nghĩa kiểu TypeScript cho các thư viện JavaScript phổ biến"


3
Đây có thể là một câu hỏi ngớ ngẩn, nhưng bạn có thể giải thích chính xác định nghĩa loại TypeScript là gì không? Có phải nó hoàn toàn để bạn có thể sử dụng các hàm thư viện trong tệp được biên dịch TypeScript mà không cần trình biên dịch phàn nàn? Nếu đó là trường hợp, bạn sẽ không cần tham chiếu định nghĩa trong ứng dụng của mình, chỉ khi bạn biên dịch các tệp ts, đúng không?
không thể phủ nhận

9
Đó là chính xác trường hợp. Nếu bạn đang viết mã bản thảo của mình trong notepad, bạn sẽ chỉ cần các định nghĩa tại thời gian biên dịch. Mặt khác, một trong những điểm hay của bản thảo là dễ dàng hơn cho phòng thu trực quan (và các trình soạn thảo khác thông qua plugin) để hiểu mã của bạn và nó giúp bạn nhiều trong việc hoàn thành tự động và thực hiện kiểm tra loại và lỗi (nhiều hơn nữa hơn JavaScript). Đó là lý do tại sao chúng tôi sử dụng các tệp định nghĩa cho mã được viết bằng JavaScript để cung cấp kiểm tra loại bản in. Tất nhiên bạn có thể tuyên bố libs là "bất kỳ", nhưng điều này không tốt. Hy vọng tôi đã giúp!
George Mavritsakis

5
Lưu ý rằng chìa khóa là thêm /// <reference path="knockout-2.2.d.ts" />vào đầu tệp .ts của bạn để nó chọn các định nghĩa.
Aidan Ryan

Tôi không thấy loại trực tiếp ở bất cứ đâu trong danh sách .... bị loại bỏ ?? di chuyển ?? bực bội
Jester

58

Tôi đã tạo giao diện nhỏ này để lấy các kiểu tĩnh cho Knockout:

interface ObservableNumber {
        (newValue: number): void;               
        (): number;                             
        subscribe: (callback: (newValue: number) => void) => void;
}
interface ObservableString {
        (newValue: string): void;               
        (): string;                             
        subscribe: (callback: (newValue: string) => void) => void;
}
interface ObservableBool {
    (newValue: bool): void;             
    (): bool;                               
    subscribe: (callback: (newValue: bool) => void) => void;
}

interface ObservableAny {
    (newValue: any): void;              
    (): any;                                
    subscribe: (callback: (newValue: any) => void) => void;
}

interface ObservableStringArray {
    (newValue: string[]): void;
    (): string[];
    remove: (value: String) => void;
    removeAll: () => void;
    push: (value: string) => void;
    indexOf: (value: string) => number;
}

interface ObservableAnyArray {
    (newValue: any[]): void;
    (): any[];
    remove: (value: any) => void;
    removeAll: () => void;
    push: (value: any) => void;
}

interface Computed {
    (): any;
}

interface Knockout {
    observable: {
        (value: number): ObservableNumber;
        (value: string): ObservableString;
        (value: bool): ObservableBool;
        (value: any): ObservableAny;
    };
    observableArray: {
        (value: string[]): ObservableStringArray;
        (value: any[]): ObservableAnyArray;
    };
    computed: {
        (func: () => any): Computed;
    };
}

Đặt nó trong "Knockout.d.ts" và sau đó tham chiếu nó từ các tệp của riêng bạn. Như bạn có thể thấy, nó sẽ được hưởng lợi rất nhiều từ thuốc generic (đang đến theo thông số kỹ thuật).

Tôi chỉ tạo một vài giao diện cho ko.observable (), nhưng ko.computing () và ko.observableArray () có thể dễ dàng thêm vào trong cùng một mẫu. Cập nhật: Tôi đã sửa các chữ ký cho đăng ký () và thêm các ví dụ về tính toán () và obsableArray ().

Để sử dụng từ tệp của riêng bạn, hãy thêm phần này ở trên cùng:

/// <reference path="./Knockout.d.ts" />
declare var ko: Knockout;

2
@JcFx: Những gì mà Anders đề cập đến có lẽ là tùy chọn để lấy tệp TypeScript .ts và xuất ra tệp khai báo giao diện .d.ts. Không có cách nào để sử dụng JavaScript được kiểm tra thường xuyên và khám phá các loại một cách kỳ diệu. Vấn đề với JS (mà TypeScripts cố gắng giải quyết) là không có cách nào để lập trình viên tuyên bố ý định của cô ấy rằng một biến phải phù hợp với một loại cụ thể. Khi bạn nói x = 'hello'trong JS, chúng tôi không biết liệu bạn có dự định nói về mã nào đó sau này không x = 34. Hance chúng ta có thể suy luận không có gì về loại x.
Sten L

@JcFx: thực ra, bạn có thể đúng rằng một số thông tin loại hạn chế có thể được lấy từ JS đơn giản. Hãy cho tôi biết làm thế nào nó đi khi bạn cố gắng!
Sten L

bản thảo là thêm khái quát.
Daniel A. Trắng


6

Không có gì thay đổi về cách thức các ràng buộc loại trực tiếp được tuyên bố trong đánh dấu, tuy nhiên chúng ta sẽ có được sự tốt đẹp trong khi các giao diện được viết cho thư viện loại trực tiếp. Về mặt này, nó sẽ hoạt động giống như Mẫu jquery , có tệp bản thảo chứa các giao diện cho hầu hết các api jQuery .

Tôi nghĩ rằng nếu bạn thoát khỏi hai khai báo biến cho ko và $ thì mã của bạn sẽ hoạt động. Chúng đang ẩn các biến ko và $ thực tế đã được tạo khi các tập lệnh loại trực tiếp và jquery được tải.

Tôi đã phải làm điều này để chuyển dự án mẫu phòng thu trực quan sang loại trực tiếp:

ứng dụng:

class GreeterViewModel {
    timerToken: number;
    utcTime: any;

    constructor (ko: any) { 
        this.utcTime = ko.observable(new Date().toUTCString());
        this.start();
    }

    start() {
        this.timerToken = setInterval(() => this.utcTime(new Date().toUTCString()), 500);
    }
}

window.onload = () => {
    // get a ref to the ko global
    var w: any;
    w = window;
    var myKO: any;
    myKO = w.ko;

    var el = document.getElementById('content');
    myKO.applyBindings(new GreeterViewModel(myKO), el);
};

mặc định.htm:

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title>TypeScript HTML App</title>
    <link rel="stylesheet" href="app.css" type="text/css" />
    <script src="Scripts/knockout-2.1.0.debug.js" type="text/javascript"></script>
    <script src="app.js"></script>
</head>
<body>
    <h1>TypeScript HTML App</h1>

    <div id="content" data-bind="text: utcTime" />
</body>
</html>

1
Không đăng trong ko cho mọi nhà xây dựng quá mức cần thiết
Simon_Weaver

3

Ok, chỉ cần sử dụng lệnh sau để nhập các loại hoặc loại trực tiếp.

npm install @types/knockout

Điều này sẽ tạo một thư mục @types trong thư mục dự án node_modules của bạn và tệp định nghĩa loại trực tiếp chỉ mục sẽ nằm trong một thư mục có tên loại trực tiếp. Tiếp theo, thông qua một tham chiếu ba dấu gạch chéo vào tệp loại. Điều này sẽ cung cấp cho các tính năng IDE và TypeScript tuyệt vời.

/// <reference path="../node_modules/@types/knockout/index.d.ts" />

Cuối cùng, chỉ cần sử dụng một câu lệnh khai báo để đưa biến ko vào phạm vi. Điều này được đánh máy mạnh mẽ vì vậy xin chào intellisense.

declare var ko: KnockoutStatic;

Vì vậy, bây giờ bạn có thể sử dụng KO giống như trong các tệp javascript của bạn.

nhập mô tả hình ảnh ở đây

Hi vọng điêu nay co ich.


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.