【问题标题】:TypeScript how to type an object with values as string or funcionTypeScript如何键入具有字符串或函数值的对象
【发布时间】:2022-01-27 03:53:56
【问题描述】:

我有一个对象messages,它可以包含键/值,键始终是字符串,值可以是字符串或函数。 我无法输入 TS。你能告诉我如何解决吗?谢谢

type Fn = (y: string) => string;

export type Messages = {
    [x: string]: string | Fn;
};

export const messages: Messages = {
    message1: 'Sorry, an error occurred',
    message2: (errorMessage: string) => `Sorry, an error occurred, ${errorMessage}`,
};


console.log(messages.message1)
console.log(messages.message2('my error')) // <<< ERROR here

https://www.typescriptlang.org/play?#code/C4TwDgpgBAYgdlAvFAFCAXFAzsATgSzgHMBKJAPmz0KIG4AoeiADzAHtdgpRIoBZCFiwBDIoKRQA3vSiyoAbWaYcBYgF1l1YlAA+sOAwC+DJqw5cAxmzg4oAW0EixWTAKGjxyaXPuOPARkwAcgBlDlwQABooYQQIXFwOKDYLCwBXBIgAEyDImTkHdzEAJkwUeMTcNycITVVSCigAAzCEqJi4hKSU9Mys6IASSQqOao9DJrzjRnorGzYAGwgAOgW2IhRCmqxlrYCSWessRZW1jb3nXb8SlCC7ECgR3CCSA-ogA

【问题讨论】:

    标签: typescript


    【解决方案1】:

    您可以创建一个具有以下结构的类:

    export class Messages {
    message1: string;
    message2: (value: string| PromiseLike<string>) => string;
    }
    

    【讨论】:

      【解决方案2】:

      你可以这样使用

      type Fn = (y: string) => string;
      
      export type Messages = {
        [x: string]: string | Fn;
      };
      
      export const messages: Messages = {
        message1: "Sorry, an error occurred",
        message2: (errorMessage: string) =>
          `Sorry, an error occurred, ${errorMessage}`,
      };
      

      JS 解决方案 => 也更适合运行时

      console.log(messages.message1);
      console.log(
        typeof messages.message2 !== "string" && messages.message2("my error")
      );
      

      TS 解决方案 => 仅在编译时工作

      const message2 = messages.message2 as Fn;
      console.log(message2("my error"));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-05
        • 1970-01-01
        • 1970-01-01
        • 2019-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多