Cặp khóa-giá trị có sẵn trong Typecript không?


130

Cặp khóa, cặp giá trị có sẵn trong bảng chữ không? Nếu có làm thế nào để làm điều đó. Bất cứ ai có thể cung cấp liên kết ví dụ mẫu.


vâng, nó là, bạn có thể chỉ định yêu cầu của bạn
Taha Naqvi

chuyển đoạn typecript (không biên dịch) sang javascript, vì vậy tất cả các tính năng của javascript đều có sẵn trong typecript. Ví dụ: nếu bạn viết mã của mình bằng js và thay đổi phần mở rộng của nó thành .ts, nó sẽ hoạt động tốt như mã js của bạn. tìm hiểu thêm về nó trên: - stylescriptlang.org/docs .
Ajay

Câu trả lời:


175

Cặp khóa-giá trị có sẵn trong Typecript không?

Đúng. Được gọi là chữ ký chỉ mục :

interface Foo {
   [key: string]: Bar;
} 
let foo:Foo = {};

Đây là khóa stringvà giá trị là Bar.

Hơn

Bạn có thể sử dụng es6 Mapcho các từ điển thích hợp, được điền bởicore-js .


1
Đây là một bản đồ hoặc từ điển. Nếu bạn muốn thứ gì đó tương đương với C # KeyValuePair, hãy xem câu trả lời stackoverflow.com/questions/36467469/…
Jack Miller,

4
Cũng rất vui khi biết, bạn không cần phải gọi nó key. Bạn có thể, ví dụ, cũng viết này: [countryCode: string]: string. Rất dễ đọc.
Jeff Huijsmans


130

Cách đơn giản nhất sẽ là:

var indexedArray: {[key: string]: number}

Sử dụng:

var indexedArray: {[key: string]: number} = {
    foo: 2118,
    bar: 2118
}

indexedArray['foo'] = 2118;
indexedArray.foo= 2118;

let foo = indexedArray['myKey'];
let bar = indexedArray.myKey;

3
Điều này đã giúp ích rất nhiều - Ít mã hơn so với cách tiếp cận giao diện vì nó không yêu cầu mô tảBar
TheGeekZn

Bạn có ví dụ về cách sử dụng này không?
trebor74

1
indexedArray = {}; indexedArray ["một"] = 1; / * tốt * / indexedArray ["hai"] = "hai"; / fail * /
Jaime

22

Cặp khóa-giá trị có sẵn trong Typecript không?

Nếu bạn nghĩ về C # KeyValuePair <string, string> : Không, nhưng bạn có thể dễ dàng tự mình xác định:

interface KeyValuePair {
    key: string;
    value: string;
}

Sử dụng:

let foo: KeyValuePair = { key: "k", value: "val" };

4
Hơi buồn cười, đã có 6 phiếu bầu với tổng bằng 0. Những người phản đối có phiền thêm nhận xét điều gì không tốt về giải pháp này không?
Jack Miller

7
Tôi cũng muốn biết. Những cử tri xuống không bao giờ để lại bình luận, tôi đôi khi nghĩ vì chính họ cũng không biết giải pháp nào tốt hơn.
Ruan

Tôi không phản đối nhưng giải pháp này không có thêm, lấy, xóa, v.v.
DaNeSh

2
@DaNeSh Đúng vậy. A KeyValuePairkhông phải là một danh sách, nhưng nó có thể là một mục nhập của một danh sách. Có thể bạn đang tìm kiếm một List<>? Xem stackoverflow.com/questions/23096260/…
Jack Miller

Làm thế nào để sử dụng khóa để nhận được giá trị? nó giống như: keyValuePair ["k"]?
Heisenberg

15

Không dành cho người hỏi, mà dành cho tất cả những người khác, những người quan tâm: Xem: Cách xác định Bản đồ phân loại của cặp giá trị khóa. trong đó khóa là một số và giá trị là một mảng đối tượng

Do đó, giải pháp là:

let yourVar: Map<YourKeyType, YourValueType>;
// now you can use it:
yourVar = new Map<YourKeyType, YourValueType>();
yourVar[YourKeyType] = <YourValueType> yourValue;

Chúc mừng!


Được Mapxác định ở đâu? Nó có dành riêng cho Angular không?
Jack Miller,

1
Bản đồ @JackMiller được định nghĩa bởi ES6: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Randolpho

1
yourVar [YourKeyType] = XXX. Điều này không thiết lập một phần tử trong Bản đồ. Nó thiết lập một thuộc tính.
mcoolive

Trình duyệt IE không hỗ trợ Bản đồ, có cách nào thay thế không?
Rahul Upadhyay

12

Một cách đơn giản khác là sử dụng tuple :

// Declare a tuple type
let x: [string, number];
// Initialize it
x = ["hello", 10];
// Access elements
console.log("First: " + x["0"] + " Second: " + x["1"]);

Đầu ra:

Thứ nhất: xin chào Thứ hai: 10


10

Bạn cũng có thể xem xét sử dụng Record, như thế này:

const someArray: Record<string, string>[] = [
    {'first': 'one'},
    {'second': 'two'}
];

Hoặc viết một cái gì đó như thế này:

const someArray: {key: string, value: string}[] = [
    {key: 'first', value: 'one'},
    {key: 'second', value: 'two'}
];

9

một ví dụ về cặp giá trị khóa là:

[key: string]: string

bạn có thể đặt bất kỳ thứ gì làm giá trị - nếu bạn có các giá trị được lập trình điền có các loại khác nhau, bạn có thể đặt:

[key: string]: any

mặc dù tiến hành theo quyết định của riêng bạn với any:)


1
class Pair<T1, T2> {
    private key: T1;
    private value: T2;

    constructor(key: T1, value: T2) {
        this.key = key;
        this.value = value;
    }

    getKey() {
        return this.key;
    }

    getValue() {
        return this.value;
    }
}
const myPair = new Pair<string, number>('test', 123);
console.log(myPair.getKey(), myPair.getValue());

Điều này không hữu ích nếu bạn đang cố gắng nhập dữ liệu đến từ chương trình phụ trợ.
Mathijs Segers,

@MathijsSegers Lớp này không có nghĩa là một kiểu cụ thể. Sử dụng lớp này như một kiểu dẫn xuất vào kiểu cụ thể của bạn
GoldBishop ngày

1

Một cách ngắn gọn là sử dụng một tuple như cặp khóa-giá trị :

const keyVal: [string, string] =  ["key", "value"] // explicit type
// or
const keyVal2 = ["key", "value"] as const // inferred type with const assertion

[key, value] bộ giá trị cũng đảm bảo khả năng tương thích với các đối tượng tích hợp sẵn JS:

Bạn có thể tạo một KeyValuePair để tái sử dụng:

type KeyValuePair<K extends string | number, V = unknown> = [K, V]
const kv: KeyValuePair<string, string> = ["key", "value"]

TS 4.0: Bộ giá trị được đặt tên

TS 4.0 sắp tới cung cấp các bộ giá trị được đặt tên / gắn nhãn để hỗ trợ tài liệu và công cụ tốt hơn:

type KeyValuePairNamed = [key: string, value: string] // add `key` and `value` labels
const [key, val]: KeyValuePairNamed = ["key", "val"] // array destructuring for convenience

Ví dụ về sân chơi làm 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.