Typescript 中是不是提供键值对?

Posted

技术标签:

【中文标题】Typescript 中是不是提供键值对?【英文标题】:Is key-value pair available in Typescript?Typescript 中是否提供键值对? 【发布时间】:2016-07-27 19:41:40 【问题描述】:

打字稿中是否提供键值对?如果是的话怎么做。谁能提供示例链接。

【问题讨论】:

是的,你能指定你的要求吗? typescript 转译(不编译)成 javascript,因此 javascript 的所有功能都可以在 typescript 中使用。例如如果您在 js 中编写代码并将其扩展名更改为 .ts,它将与您的 js 代码一样正常工作。了解更多信息:- typescriptlang.org/docs。 【参考方案1】:

Typescript 中是否提供键值对?

是的。致电an index signature:

interface Foo 
   [key: string]: number;



let foo:Foo = ;
foo['hello'] = 123;
foo = 
  'leet': 1337
;
console.log(foo['leet']); // 1337

这里的键是string,值是number

更多

您可以将 es6 Map 用于正确的字典,polyfilled by core-js

【讨论】:

这是地图或字典。如果您想要与 C# KeyValuePair 等效的东西,请参阅答案 ***.com/questions/36467469/… 也很高兴知道,您无需将其称为key。例如,您也可以这样写:[countryCode: string]: string。很好的可读性。 这是更新后的链接:basarat.gitbook.io/typescript/type-system/index-signatures 是的,这是一张地图。但每次我搜索“TypeScript Map”时,我得到的只是 es6 Map,这不是我想要的!所以我非常感谢这个答案在这里。 你救了我 【参考方案2】:

KeyValue 接口存在于使用 typescript 的 Angular 库中。 因此,如果您的项目是有角度的,那么您可以使用这个通用接口。 或者,如果您没有在 Angular 中使用 TS,您可以使用它的声明来获得一个不错的通用 KeyValue 接口。

export declare interface KeyValue<K, V> 
    key: K;
    value: V;

【讨论】:

【参考方案3】:

一种简洁的方法是将tuple 用作key-value pair:

const keyVal: [string, string] =  ["key", "value"] // explicit type
const keyVal2 = ["key", "value"] as const // inferred type with const assertion
const [key, val] = ["key", "val"] // usage with array destructuring

您可以创建一个通用的KeyValuePair 类型以实现可重用性:

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

TS 4.0

provideslabeled tuple elements 以获得更好的文档和工具支持:

type KeyValuePairNamed = [key: string, value: string] // "key" and "value" labels

兼容性

[key, value] 元组还保证了对 JS 内置对象的兼容性:

Object,尤其是。 Object.entries, Object.fromEntries Map,尤其是。 Map.prototype.entriesnew Map() 构造函数 Set,尤其是。 Set.prototype.entries

Playground

【讨论】:

如何使用这个 KeyValuePairNamed? 只写const kvp: KeyValuePairNamed = ["mykey", "myval"]。标签是用于文档目的的仅类型构造。【参考方案4】:

TypeScript 有 Map。你可以像这样使用:

public myMap = new Map<K,V>([
[k1, v1],
[k2, v2]
]);

myMap.get(key); // returns value
myMap.set(key, value); // import a new data
myMap.has(key); // check data

【讨论】:

【参考方案5】:

如果您尝试使用以下示例

示例: 值1:“值1”

并根据某些条件动态添加conditionalData,试试

let dataToWrite: any = value1: "value1";

if(conditionalData)
   dataToWrite["conditionalData"] = conditionalData

【讨论】:

【参考方案6】:

键值对的一个例子是:

[key: string]: string

当然,你可以把任何东西作为值

【讨论】:

export default interface KeyValuePair [key: string]: string | number | boolean; 稍微好一点,但是这是弱打字吗?这是否在某种程度上违背了目的?【参考方案7】:

最简单的方法是:

var indexedArray: [key: string]: number

用法:

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


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

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

【讨论】:

这很有帮助 - 比接口方法更少的代码,因为它不需要描述 Bar 你有这个用法的例子吗? indexedArray = ; indexedArray["one"] = 1; /* 好 */ indexedArray["two"] = "two"; / 失败 */ 最佳答案。与简单数据类型混淆程度最低【参考方案8】:

你也可以考虑使用Record,像这样:

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

或者这样写:

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

【讨论】:

【参考方案9】:
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());

【讨论】:

如果您尝试输入来自后端的数据,这将无济于事。 @MathijsSegers 这个类并不是一个具体的类型。将此类用作具体类型的派生类型【参考方案10】:

另一种简单的方法是使用tuple:

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

输出:

第一个:你好第二个:10

【讨论】:

【参考方案11】:

Typescript 中是否提供键值对?

如果您想到一个 C# KeyValuePair<string, string>:不,但您可以轻松地自己定义一个:

interface KeyValuePair 
    key: string;
    value: string;

用法:

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

【讨论】:

有点好笑,已经 6 票,总和为 0。否决票的人会介意添加评论,这个解决方案有什么不好吗? 我也想知道。反对者从不发表评论,我有时认为是因为他们自己不知道更好的解决方案。 我没有投反对票,但这个解决方案没有添加、获取、删除等功能。 @DaNeSh 没错。 KeyValuePair 不是列表,但它可以是列表的条目。也许您正在寻找List&lt;&gt;?见***.com/questions/23096260/… KeyValuePair 不是列表。里面只有一个键和一个值。键:foo.key 和值:foo.value。看来您正在寻找List&lt;&gt; --> ***.com/questions/23096260/…【参考方案12】:

不是针对提问者,而是针对所有其他感兴趣的人: 见:How to define Typescript Map of key value pair. where key is a number and value is an array of objects

因此解决方案是:

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

干杯!

【讨论】:

Map 在哪里定义?它是 Angular 特定的吗? @JackMiller 映射由 ES6 定义:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… yourVar[YourKeyType] = XXX。这不会在 Map 中设置元素。它确实设置了一个属性。 IE浏览器不支持地图,有什么办法吗? @RahulUpadhyay 普通对象。

以上是关于Typescript 中是不是提供键值对?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 TypeScript 中创建一个对每个键值对都是类型安全的键值字典吗?

我正在尝试通过外部 api 从 json 数据中获取键值对并使用 angular 和 typescript 显示它。我怎样才能做到这一点?

如何在猫鼬中编写键值对对象模式

如何在谷歌视觉ocr中获取键值对?

在json模式中定义键值对的正确方法是啥

python列表中字典按指定相同的键值对合并到一个列表中