键名未知的Typescript接口

键名未知的Typescript接口,typescript,types,interface,typing,Typescript,Types,Interface,Typing,我试图在Typescript中创建一个既有未知的键名又有已知键名的接口。大概是这样的: interface Data { test: string, [key: string]: string, foo?: boolean, } 这样我就能做到: x: Data = { test: "test_string", "unknown_key": "value" } 有人知道我是怎么做到的吗?谢谢。一种方

我试图在Typescript中创建一个既有未知的键名又有已知键名的接口。大概是这样的:

interface Data { 
    test: string,
    [key: string]: string,
    foo?: boolean,
}
这样我就能做到:

x: Data = {
  test: "test_string",
  "unknown_key": "value"
}

有人知道我是怎么做到的吗?谢谢。

一种方法是将自定义字段与以下内容结合使用:

类型数据=记录&{
测试:字符串;
foo?:布尔;
}

这里有一个例子:


// You can omit `test` property in Data interface since it has a string type
interface Data { 
    [key: string]: string,
    foo?: boolean,
}

// You can use Verify helper instead of Data interface. It is almost the same
type VerifyT<T> = { foo?: boolean } & { [K in keyof T]: K extends "foo" ? unknown : string };

const make = <T extends VerifyT<T>>(t: T) => t;
make({ age: 'sdf', foo: true }) // Ok
make({ age: 'sdf', foo: undefined }) // ok
make({ age: 'sdf', foo: undefined }) // false
make({ age: 'sdf', foo: 'some text' }) // error
make({ age: 'sdf', foo: 1 }) // error
make({ age: 'sdf', foo: [1] }) // error

//您可以在数据接口中省略'test'属性,因为它具有字符串类型
接口数据{
[键:字符串]:字符串,
foo?:布尔值,
}
//您可以使用验证帮助器而不是数据接口。几乎是一样的
类型VerifyT={foo?:boolean}&{[K in keyof T]:K扩展“foo”?未知:string};
常数make=(t:t)=>t;
make({age:'sdf',foo:true})//Ok
make({age:'sdf',foo:undefined})//确定
make({age:'sdf',foo:undefined})//false
make({age:'sdf',foo:'some text'})//错误
make({age:'sdf',foo:1})//错误
make({age:'sdf',foo:[1]})//错误
不要担心函数开销,因为如果使用V8引擎,它将99%内联并优化

所有的老师都去回答


也可以随意将此问题标记为重复的

可能的
[key:string]
类型必须包括所有其他属性的类型,因此在您的情况下
[key:string]:string | boolean | undefined
。此解决方案不是类型安全的,因为您仍然可以将
string
用于
foo

// You can omit `test` property in Data interface since it has a string type
interface Data { 
    [key: string]: string,
    foo?: boolean,
}

// You can use Verify helper instead of Data interface. It is almost the same
type VerifyT<T> = { foo?: boolean } & { [K in keyof T]: K extends "foo" ? unknown : string };

const make = <T extends VerifyT<T>>(t: T) => t;
make({ age: 'sdf', foo: true }) // Ok
make({ age: 'sdf', foo: undefined }) // ok
make({ age: 'sdf', foo: undefined }) // false
make({ age: 'sdf', foo: 'some text' }) // error
make({ age: 'sdf', foo: 1 }) // error
make({ age: 'sdf', foo: [1] }) // error