Chức năng gõ tốt hơn để tạo truy vấn phương tiện


8

Tôi đang theo dõi cùng với bài đăng này: https://medium.com/@samuelresua/easy-media-queries-in-styled-components-690b78f50053

Tôi đã tạo như sau trong Bản mô tả, nhưng đã phải dùng đến cách gõ anynhiều hơn tôi phải chắc chắn:

const breakpoints: ObjectMap<number> = {
  small: 767,
  medium: 992,
  large: 1200,
  extraLarge: 1240
};

export const media = Object.keys(breakpoints).reduce((acc: { [key: string]: (...args: any) => any }, label) => {
  acc[label] = (...args) => css`
     @media (min-width: ${breakpoints[label]}px) {
        ${css(...args as [any])};
     }
  `;
  return acc;
}, {});

Kết quả là, tôi không có trợ giúp trong IDE của mình khi tôi viết các kiểu trong các khối truy vấn phương tiện của mình:

styled.button<Props>`
  background: red; /* this must be a valid style */
  ${({ theme }) => theme.media.large`
      background: blue;
      foo: bar; /* this isn't caught */
   `

Bất cứ ai biết làm thế nào tôi có thể cải thiện mediachức năng của tôi ?

Câu trả lời:


0

styled-componentscho phép bạn sử dụng các đối tượng cho các thuộc tính CSS cũng như các chuỗi mẫu và các đối tượng được trình biên dịch TypeScript hiểu rõ hơn nhiều. Thử cái này:

const breakpoints: ObjectMap<number> = {
  small: 767,
  medium: 992,
  large: 1200,
  extraLarge: 1240
};

export const media = (size: keyof typeof breakpoints, properties: CSSObject) => ({[`@media (min-width: ${breakpoints[size]})`]: properties});

const MyButton = styled.button<Props>(({ theme }) => ({
  background: red, // this must be a valid style
  ...theme.media('large', {
    background: blue // this is also validated :)
  })
}));

5

Tôi tin rằng đây không phải là sự cố TypeScript mà là sự cố plugin IntelliSense.

Từ quan điểm của TypeScript, nội dung giữa các backticks là loại TemplateStringsArray. TypeScript không nhận thức được các thuộc tính CSS hợp lệ vì nó thấy một chuỗi các chuỗi.

Tôi tin rằng việc xác thực được thực hiện ở cấp độ plugin bằng kiểu chữ-kiểu chữ-plugin .

Xem https://github.com/styled-components/vscode-styled-components/pull/41

Tôi sẽ gửi một yêu cầu tính năng hoặc báo cáo lỗi ở đây .


Tôi vẫn muốn cải thiện truy vấn phương tiện của mình nếu có thể ... Nhưng cảm ơn vì đầu vào!
Ông Epic

Chúng ta hãy chờ xem liệu giả định của tôi có sai không và những người khác có giải pháp. Trong khi đó, tôi chỉ nhận thấy rằng xác thực CSS dường như không hoạt động đối với các kiểu trong quy tắc @media CSS có khả năng xác nhận giới hạn này của plugin IntelliSense.
sunknudsen

1
Tôi vừa gửi một báo cáo lỗi. github.com/microsoft/typescript-styled-plugin/issues/113
sunknudsen

1

Nếu tôi hiểu chính xác, bạn muốn thoát khỏi any.

Đây là cách bạn có thể làm điều đó:

import {
  css,
  CSSObject,
  SimpleInterpolation,
  FlattenSimpleInterpolation,
} from 'styled-components';

type ObjectMap<T> = {[key: string]: T};

const breakpoints: ObjectMap<number> = {
  small: 767,
  medium: 992,
  large: 1200,
  extraLarge: 1240,
};

export const media = Object.keys(breakpoints).reduce(
  (
    acc: {
      [key: string]: (
        first: TemplateStringsArray | CSSObject,
        ...interpolations: SimpleInterpolation[]
      ) => FlattenSimpleInterpolation;
      // ^^^ this is the first implementation of  `BaseThemedCssFunction`
    },
    label
  ) => {
    acc[label] = (...args) => css`
      @media (min-width: ${breakpoints[label]}px) {
        ${css(...args)};
      }
    `;
    return acc;
  },
  {}
);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.