Typescript 有没有一种方法可以声明依赖于其同级类型的类型

Typescript 有没有一种方法可以声明依赖于其同级类型的类型,typescript,Typescript,我正在努力实现一些可能有些过分但很好的东西。我想声明两个参数,其中一个表示keyofaModel,而另一个表示Model中的任何类型。请参见下面的示例: 接口示例{ 密钥:keyoft; 值:T类型[键]; } 接口测试{ 第一:字符串; 第二:数量; } 正确的值为: let测试:示例={ 键:“第一”, 价值观:“你好,世界!” }; 一个不正确的例子是: let测试:示例={ 键:“第一”, 价值:123 }; 使用Typescript可以实现这样的目标吗?这可能会对您有所帮助():

我正在努力实现一些可能有些过分但很好的东西。我想声明两个参数,其中一个表示
keyof
aModel,而另一个表示Model中的任何类型。请参见下面的示例:

接口示例{
密钥:keyoft;
值:T类型[键];
}
接口测试{
第一:字符串;
第二:数量;
}
正确的值为:

let测试:示例={
键:“第一”,
价值观:“你好,世界!”
};
一个不正确的例子是:

let测试:示例={
键:“第一”,
价值:123
};
使用Typescript可以实现这样的目标吗?

这可能会对您有所帮助():

接口示例{
值:T[K];
}
接口测试{
第一:字符串;
第二:数量;
}
var第一:示例;
first.value;//一串
var第二:示例;
第二个值;//数

这可能足够近了:

interface Example<T, K extends keyof T> {
    key: K;
    value: T[K];
}
interface Test {
    first: string;
    second: number;
}
const ok1 : Example<Test, "first"> = {
    key: "first",
    value: "s",
}
const ok2 : Example<Test, "second"> = {
    key: "second",
    value: 12,
}
const error1 : Example<Test, "first"> = {
    key: "first",
    value: 12,
}
接口示例{
关键词:K;
值:T[K];
}
接口测试{
第一:字符串;
第二:数量;
}
常数ok1:示例={
键:“第一”,
值:“s”,
}
常数ok2:示例={
键:“第二”,
数值:12,
}
常量错误1:示例={
键:“第一”,
数值:12,
}

有多种方法可以做到这一点,具体取决于您试图做什么

如果您有一个函数,并且需要对参数强制执行此操作,我们可以使用泛型类型参数执行此操作:

interface Example<T, K extends keyof T> {
    key: K;
    value: T[K];
}
function withProp<T>(){
  return function<K extends keyof T>(value: Example<T, K>) {

  }
}

let test= withProp<Test>()({
    key: "first",
    value: "Hello world!"
});

// Error
let test2 = withProp<Test>()({
    key: "first",
    value: 123
});
接口示例{
关键词:K;
值:T[K];
}
函数withProp(){
返回函数(值:示例){
}
}
let test=withProp()({
键:“第一”,
价值观:“你好,世界!”
});
//错误
设test2=withProp()({
键:“第一”,
价值:123
});

如果要对随机变量强制执行此操作,可以使用映射类型生成键类型的所有可能组合作为联合:

type Example<T> = {
  [K in keyof T]: {
      key: K;
      value: T[K];
  }
}[keyof T]

let test: Example<Test> = {
    key: "first",
    value: "Hello world!"
};

// Error
let test2: Example<Test> = {
    key: "first",
    value: 123
}
类型示例={
[K in keyof T]:{
关键词:K;
值:T[K];
}
}[keyof T]
让测试:示例={
键:“第一”,
价值观:“你好,世界!”
};
//错误
让test2:Example={
键:“第一”,
价值:123
}

type Example<T> = {
  [K in keyof T]: {
      key: K;
      value: T[K];
  }
}[keyof T]

let test: Example<Test> = {
    key: "first",
    value: "Hello world!"
};

// Error
let test2: Example<Test> = {
    key: "first",
    value: 123
}