来自数组类型的打字稿接口

     2023-03-13     239

关键词:

【中文标题】来自数组类型的打字稿接口【英文标题】:Typescript interface from array type 【发布时间】:2018-01-18 08:20:01 【问题描述】:

我需要强制一个数组具有一组特定的值,这些值应该是我界面的键。 我可以用

强制数组
type SomeProperties = ['prop1', 'prop2', 'prop3'];

但我不知道如何强制接口具有这些属性。我尝试了类似的东西

type MyInterface = 
  [key in keyof SomeProperties]: string;

但显然数组的键只是数字所以我的界面变成了

interface MyInterface 
  0: string;
  1: string;
  2: string;

而不是想要的界面

interface MyInterface 
  prop1: string;
  prop2: string;
  prop3: string;

你知道是否有办法在 Typescript 中实现这一点?

这会很有用,因为我需要迭代一些属性来“克隆”一个对象,而且我还需要轻松访问这些属性。 在类型和接口中重复属性对我来说有点脆弱。

【问题讨论】:

尝试将keyof SomeProperties 更改为SomeProperties[number] @jcalz 这是个好主意,但不幸的是它不起作用,IDE 提示我属性,如 lengthatcharAt 等等,但不是 prop1prop2prop3 :( 不是keyof SomeProperties[number];只是SomeProperties[number] @jcalz 有用,谢谢!如果您创建答案,我可以接受它作为最佳答案 【参考方案1】:

值得注意的是:你不能在 TypeScript 中迭代元组类型

其实可以!自 TypeScript 3.1 you can safely use tuple types in mapped types like objects.

这类操作只能应用于types,不能应用于interfaces。

type SomeProperties = 'prop1' | 'prop2' | 'prop3';

type MyType = Record<SomeProperties, string>;

// equivalent to
// type MyType = 
//   [key in SomeProperties]: string
// 

从消费者的角度来看,类型和接口是相同的(当您要求MyType时,您不在乎它是接口还是类型,此时它们是相同的)

【讨论】:

我将使用类型更改我的问题,对不起。那么你认为实现我的要求是不可能的吗? 我认为这是一个更好的选择,除非您正在处理数组,例如对于泛型: const ATTACK = "attack"; const CARRY = "携带"; const CLAIM = "索赔";常量工作=“工作”; type EnumDictionary = [K in Enum]: TValue ; const CREEP_BODY_PART_COST: EnumDictionary = attack: 80, // OK carry: 50, // OK claim: 600, // OK work: 100 // FAIL ; @DropBearDan Screeps FTW!【参考方案2】:

如您所见,您尝试访问的字符串不是SomeProperties,而是SomeProperties元素

您可以在此处使用indexed access operator:如果KT 的键(或键的联合),则T[K] 是访问对应的属性类型(或属性类型的联合) KT 的密钥。

元组和数组接受number作为键类型,所以你想用SomeProperties[number]给你联合"prop1"|"prop2"|"prop3"

type SomeProperties = ['prop1', 'prop2', 'prop3'];

type MyInterface = 
  [key in SomeProperties[number]]: string;


const myInterface: MyInterface = 
  prop1: 'this',
  prop2: 'works',
  prop3: 'now'

希望有所帮助;祝你好运!

【讨论】:

打字稿从元组/数组值派生联合类型

...这个值联合类型派生?我想要这个是因为我想定义只允许来自静态数组的值的类型,并且还需要在运行时枚举这些值,所以我使用数组。如何 查看详情

是否可以强制打字稿使用来自definitelyTyped 的类型而不是本机库类型?

】是否可以强制打字稿使用来自definitelyTyped的类型而不是本机库类型?【英文标题】:IsitpossibletoforcetypescripttousetypesfromDefinitelyTypedinsteadofnativelibtypes?【发布时间】:2020-09-0522:42:33【问题描述】:我正在尝试迁移到现在具有内置... 查看详情

来自键值对象的打字稿类型函数

】来自键值对象的打字稿类型函数【英文标题】:Typescripttypedfunctionfromkeyvalueobject【发布时间】:2021-05-0621:50:53【问题描述】:我有一个类似的对象constlookup=key1:object1,key2:object2,key3:object3我需要创建一个接受key(key1/key2...)作为第一... 查看详情

打字稿:为啥类型别名满足约束但相同的接口不满足?

】打字稿:为啥类型别名满足约束但相同的接口不满足?【英文标题】:Typescript:Whytypealiassatisfiesaconstraintbutsameinterfacedoesn\'t?打字稿:为什么类型别名满足约束但相同的接口不满足?【发布时间】:2021-03-1617:33:20【问题描述】:... 查看详情

打字稿。为啥功能接口中描述的“返回值”类型没有严格执行?

】打字稿。为啥功能接口中描述的“返回值”类型没有严格执行?【英文标题】:Typescript.Whydescribed"returnvalue\'s"typeinfunctionalinterfaceisbeingnotstrictimplemented?打字稿。为什么功能接口中描述的“返回值”类型没有严格执行?【... 查看详情

将打字稿接口属性类型转换为联合[重复]

】将打字稿接口属性类型转换为联合[重复]【英文标题】:Turntypescriptinterfacepropertytypesintounion[duplicate]【发布时间】:2022-01-0417:56:23【问题描述】:我有这个接口,我想根据它包含的键类型生成一个新类型。interfaceSomeTypeabc:string;d... 查看详情

打字稿扩展了两个像类型一样的接口?

】打字稿扩展了两个像类型一样的接口?【英文标题】:Typescriptextendtwointerfacesliketype?【发布时间】:2021-04-3011:54:06【问题描述】:在查看thedocumentation和这个SOQuestion之后,我正在寻找的行为如下:typeA=a:string;typeB=b:string;typeC=A&... 查看详情

打字稿是不是允许接口和字符串联合类型?

】打字稿是不是允许接口和字符串联合类型?【英文标题】:Doestypescriptallowinterfaceandstringuniontypes?打字稿是否允许接口和字符串联合类型?【发布时间】:2018-12-0700:41:22【问题描述】:我正在尝试实现一个类似的方法,该方法采... 查看详情

打字稿:将类数组的类型转换为构造类数组的类型

】打字稿:将类数组的类型转换为构造类数组的类型【英文标题】:Typescript:convertingtypeofarrayofclassestotypeofarrayofconstructedclasses【发布时间】:2022-01-2117:50:51【问题描述】:有一个问题我一直在努力解决。我有一个函数,里面放了... 查看详情

打字稿:使用变量类型强类型传入数组

】打字稿:使用变量类型强类型传入数组【英文标题】:Typescript:Stronglytypeincomingarraywithvariabletypes【发布时间】:2020-10-2700:43:10【问题描述】:我有一个JSON数组,它可以包含IPerson和ICompany定义的两种类型中的任何一种。["Name":"Bob... 查看详情

如何在打字稿上制作多种类型的属性接口

】如何在打字稿上制作多种类型的属性接口【英文标题】:Howcanimakemultipletypepropertyinterfaceontypescript【发布时间】:2019-04-0312:23:14【问题描述】:我想在typescript中使用两个不同的接口创建接口属性。这可能吗?interfaceIPayload1id:stri... 查看详情

如何在打字稿中组织我的类型/接口声明?

】如何在打字稿中组织我的类型/接口声明?【英文标题】:HowdoIorganisemytypes/interfacesdeclarationsintypescript?【发布时间】:2019-04-0805:07:53【问题描述】:我对typescript有点陌生,其中让我有点困惑的是类型/接口声明。我正在编写一个... 查看详情

打字稿泛型,获取数组内容的类型

】打字稿泛型,获取数组内容的类型【英文标题】:Typescriptgenerics,gettypeofArraycontents【发布时间】:2019-12-2111:30:51【问题描述】:我已经构建了一个方法,它将一个数组与传入的另一个数组连接起来。该数组位于一个名为state的... 查看详情

打字稿类型检查不适用于数组过滤器

】打字稿类型检查不适用于数组过滤器【英文标题】:TypescripttypechecknotworkingwithArrayfilter【发布时间】:2019-10-1301:10:27【问题描述】:我正在使用Array.filter和instanceof从更通用的数组中获取某种类型的所有对象。letcars:Car[]=this.gameO... 查看详情

如何在打字稿中定义一个常量数组

...ing[]=[\'Dim\',\'Lun\',\'Mar\',\'Mer\',\'Jeu\',\'Ven\',\'Sam\']错误信息来自TypeScript(3.0)编译器:TS2322:类型\'stri 查看详情

将 JSON 对象转换/翻译为打字稿类型/接口的工具?

】将JSON对象转换/翻译为打字稿类型/接口的工具?【英文标题】:Atooltoconvert/translateJSONobjectstotypescripttypes/interfaces?【发布时间】:2016-10-0507:38:48【问题描述】:我正在寻找一个简单的工具来做一件简单的事情:将JSON对象转换为t... 查看详情

如何使用可选的唯一字符串定义数组打字稿接口?

】如何使用可选的唯一字符串定义数组打字稿接口?【英文标题】:Howtodefinearraytypescriptinterfacewithoptionaluniquestrings?【发布时间】:2020-09-0412:55:08【问题描述】:我想定义一个带有可选字符串值的接口。比如:interfaceIEntityvalues:[\'... 查看详情

我们如何在打字稿中定义对象类型接口?

】我们如何在打字稿中定义对象类型接口?【英文标题】:Howcanwedefineobjecttypeinterfaceintypescript?【发布时间】:2018-02-2218:35:45【问题描述】:我想定义一个包含对象和不同类型的接口比如exportinterfaceexamplecode:string;category:name:string,r... 查看详情